如何强制执行BigDecimal的有效位数

时间:2011-02-09 21:13:31

标签: ruby-on-rails ruby bigdecimal

我在mysql中定义了一个十进制字段,其缩放/有效数字为4(例如10.0001)。 ActiveRecord将其作为BigDecimal返回。

我可以在ActiveRecord中设置比例为5的字段(例如10.00001),然后保存它,这会有效地截断该值(它存储为10.0000)。

有没有办法防止这种情况发生?如果有办法强制扩展,我已经查看了BigDecimal类。找不到一个。我可以计算BigDecimal的比例并返回验证错误,但我想知道是否有更好的方法来强制执行它。

1 个答案:

答案 0 :(得分: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

通过以某种方式读取模式,甚至可以自动分配比例因子。

有关其他舍入模式,请参阅Ruby BigDecimal类文档中的ROUND_*常量名称。