Как обеспечить количество значащих цифр BigDecimal

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

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

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


person Ward Bekker    schedule 09.02.2011    source источник


Ответы (1)


Вы можете добавить обработчик 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 документация класса для других режимов округления.

person maerics    schedule 17.02.2011