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

Ruby on rails 如何强制执行BigDecimal的有效位数,ruby-on-rails,ruby,bigdecimal,Ruby On Rails,Ruby,Bigdecimal,我在mysql中定义了一个小数字段,其小数位数/有效位数为4(例如10.0001)。ActiveRecord以BigDecimal的形式返回它 我可以将ActiveRecord中的字段设置为5(例如10.00001),然后保存它,这样可以有效地截断该值(存储为10.0000) 有没有办法防止这种情况?我已经研究过BigDecimal类,看是否有强制缩放的方法。找不到。我可以计算BigDecimal的小数位数并返回一个验证错误,但我想知道是否有更好的方法来执行它。您可以在保存类的处理程序之前添加,

我在mysql中定义了一个小数字段,其小数位数/有效位数为4(例如10.0001)。ActiveRecord以BigDecimal的形式返回它

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


有没有办法防止这种情况?我已经研究过BigDecimal类,看是否有强制缩放的方法。找不到。我可以计算BigDecimal的小数位数并返回一个验证错误,但我想知道是否有更好的方法来执行它。

您可以在保存类的
处理程序之前添加
,并根据自己的喜好包含要舍入的逻辑,例如:

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
classmyrecord10.00009)
r、 救命!
r、 十进制#u字段#=>10.0001
甚至可以通过某种方式读取模式来自动分配比例因子

有关其他舍入模式,请参见Ruby类文档中的
ROUND.*
常量名称