【问题标题】:Why does Ruby's BigDecimal represent numbers oddly sometimes?为什么 Ruby 的 BigDecimal 有时会奇怪地表示数字?
【发布时间】:2010-11-12 18:30:30
【问题描述】:

当我运行某些报告时,我看到了非常非常奇怪的行为:

>> p = BigDecimal.new('0.1785990254E5')
=> #<BigDecimal:b649b978,'0.1785990254E5',16(16)>
>> q = BigDecimal.new('0.76149149E4')
=> #<BigDecimal:b64968d8,'0.76149149E4',8(16)>
>> p-q
=> #<BigDecimal:b6495ab4,'0.124498764E5',16(32)>
>> p.to_s
=> "17859.90254"
>> q.to_s
=> "7614.9149"
>> (p-q).to_s
=> "10244.98764"

如果您注意到,p.to_s 和 BigDecimal 的表示看起来一致。与qq.to_s 相同。但是,p-q 的字符串表示为“0.1244...”,但在格式化为“10244.98...”时会出现

当我通过 number_to_currency 运行它时,它实际上显示了错误的数字 ($12,449.88) 而不是预期的数字,但仅在我的 RHEL 4 Box 上。

【问题讨论】:

标签: ruby-on-rails ruby floating-point bigdecimal


【解决方案1】:

查看版本后,我似乎在 RHEL 机器上运行 Ruby 1.8.5,在本地机器上运行 Ruby 1.8.6。我认为这会解决问题吗?真是奇怪的问题。

更新: 已确认 - 升级到 1.8.6 解决了这些问题。

【讨论】:

  • 很有可能。在进行过多测试之前,您当然应该解决这个问题。
【解决方案2】:
>> p = BigDecimal.new('0.1785990254E5')
=> #<BigDecimal:51c9e4,'0.1785990254E5',16(16)>
>> q = BigDecimal.new('0.76149149E4')
=> #<BigDecimal:518e98,'0.76149149E4',8(16)>
>> p-q
=> #<BigDecimal:516af8,'0.1024498764E5',16(32)>
>> (p-q).to_s
=> "0.1024498764E5"

在我手工编译的 ruby​​ 1.8.7/OSX 上

听起来他们可能已经修复了库中的一个错误——但仅是速度改进就可能是升级的充分理由(如果你在维护一个无法升级的应用程序时遇到困难,我觉得你)

我有点困惑为什么你试图将 0.1024498764E5 显示为货币。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-06
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    • 2021-08-26
    相关资源
    最近更新 更多