Как применить количество значащих цифр BigDecimal - PullRequest
2 голосов
/ 10 февраля 2011

Я определил десятичное поле со шкалой / значащей цифрой 4 в mysql (например, 10.0001). ActiveRecord возвращает его как BigDecimal.

Я могу установить поле в ActiveRecord со шкалой 5 (например, 10.00001) и сохранить его, что эффективно усекает значение (оно сохраняется как 10.0000).

Есть ли способ предотвратить это? Я уже посмотрел на класс BigDecimal, если есть способ заставить масштабировать. Не могу найти. Я могу вычислить масштаб BigDecimal и вернуть ошибку проверки, но мне интересно, есть ли более хороший способ обеспечить ее выполнение.

1 Ответ

1 голос
/ 17 февраля 2011

Вы можете добавить обработчик before_save для своего класса и включить логику для округления по своему усмотрению, например:

class MyRecord < ActiveRecord::Base
  SCALE = 4
  before_save :round_decimal_field
  def round_decimal_field
    self.decimal_field.round(SCALE, BigDecimal::ROUND_UP)
  end
end
r = MyRecord.new(:decimal_field => 10.00009)
r.save!
r.decimal_field # => 10.0001

Масштабный коэффициент может быть даже назначен автоматически при чтении схемы каким-либо образом.

См. Имена ROUND_* констант в документации класса Ruby BigDecimal для других режимов округления.

...