【问题标题】:Rails: Storing BigDecimal in DatabaseRails:在数据库中存储 BigDecimal
【发布时间】:2017-09-09 20:55:35
【问题描述】:

我正在处理一堆 BigDecimal,我想将它们存储到我的数据库中。理想情况下不会损失任何准确性。我不知道实现这一目标的最佳方式。


我想到了这个:

t.decimal :value, precision: 1000, scale: 30

这看起来不是解决这个问题的好方法。 1. 它仍然会影响准确性。 2. 它变得不必要地大了。


有没有办法存储对象,例如:#<BigDecimal:586a238,'0.563E0',9(36)> 到数据库(在text 列中),然后将其重新初始化为 BigDecimal?

【问题讨论】:

    标签: ruby-on-rails ruby database decimal bigdecimal


    【解决方案1】:

    您可能想查看composed_of

    但我更喜欢使用自定义 getter 和 setter 方法,因为我认为它们更易于阅读和理解。

    示例:假设您的属性名为foo,并且您想在应用程序中使用BigDecimal,但将值作为字符串存储在数据库中:

    def foo
      BigDecimal.new(read_attribute(:foo))
    end
    
    def foo=(foo)
      write_attribute(:foo, foo.to_s)
    end
    

    【讨论】:

      【解决方案2】:

      默认情况下,PostgreSQL Decimal 的范围为“小数点前最多 131072 位;小数点后最多 16383 位”。这还不够吗?

      https://www.postgresql.org/docs/9.1/static/datatype-numeric.html

      只需使用:

      t.decimal :value
      

      【讨论】:

      • 我之前使用过这个解决方案,但是导致了一些计算错误。像 spickermann 建议的那样处理它,一切正常。 :)
      • 这很奇怪。我敦促您就此提出一个问题。 github.com/rails/rails/issues
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-11-23
      • 1970-01-01
      • 2020-11-04
      • 1970-01-01
      • 2011-02-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多