【问题标题】:How to enforce the number of significant digits of a BigDecimal如何强制 BigDecimal 的有效位数
【发布时间】:2011-06-24 10:38:52
【问题描述】:
我在 mysql(例如 10.0001 )中定义了一个小数字段,其小数位数/有效数字为 4。 ActiveRecord 将其作为 BigDecimal 返回。
我可以在 ActiveRecord 中将字段设置为 5(例如 10.00001 ),然后保存它,这会有效地截断值(它存储为 10.0000)。
有没有办法防止这种情况发生?如果有强制缩放的方法,我已经看过 BigDecimal 类。找不到一个。我可以计算 BigDecimal 的比例并返回验证错误,但我想知道是否有更好的方法来执行它。
【问题讨论】:
标签:
ruby-on-rails
ruby
bigdecimal
【解决方案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_* 常量名称。