【问题标题】: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_* 常量名称。

    【讨论】:

      猜你喜欢
      • 2012-05-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-26
      相关资源
      最近更新 更多