为什么Ruby的BigDecimal有时奇怪地表示数字?

时间:2009-07-21 19:25:17

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

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

>> 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。

2 个答案:

答案 0 :(得分:1)

看了这些版本后,看来我在RHEL盒子上运行Ruby 1.8.5,在本地盒子上运行Ruby 1.8.6。我认为这会解决问题吗?确实存在奇怪的问题。

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

答案 1 :(得分:0)

>> 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显示为货币感到有点困惑。