在编写一个具有表示为BigDecimal的值的测试时,我遇到了奇怪的事情,并决定深入研究它。简而言之,当四舍五入到小数点后两位时,“0.00009”将返回0.01而不是0.00。真的。这是我的脚本/控制台捕获:

>> bp = BigDecimal('0.09')
=> #<BigDecimal:210fe08,'0.9E-1',4(8)>
>> bp.round(2,BigDecimal::ROUND_HALF_DOWN).to_f
=> 0.09
>> bp = BigDecimal('0.009')
=> #<BigDecimal:210bcf4,'0.9E-2',4(8)>
>> bp.round(2,BigDecimal::ROUND_HALF_DOWN).to_f
=> 0.01
>> bp = BigDecimal('0.0009')
=> #<BigDecimal:2107a8c,'0.9E-3',4(12)>
>> bp.round(2,BigDecimal::ROUND_HALF_DOWN).to_f
=> 0.0
>> bp = BigDecimal('0.00009')
=> #<BigDecimal:2103428,'0.9E-4',4(12)>
>> bp.round(2,BigDecimal::ROUND_HALF_DOWN).to_f
=> 0.01
>> bp = BigDecimal('0.000009')
=> #<BigDecimal:20ff0f8,'0.9E-5',4(12)>
>> bp.round(2,BigDecimal::ROUND_HALF_DOWN).to_f
=> 0.0

哦,如果使用默认模式,我将得到相同的结果,如下所示:
>> bd = BigDecimal('0.00009')
=> #<BigDecimal:2152ed8,'0.9E-4',4(12)>
>> bd.round(2).to_f
=> 0.01

这是我的版本:
ruby 1.8.6 (2008-03-03 patchlevel 114) [i686-darwin9.2.2]
Rails 2.3.4

有人看到过这样的东西吗?

最佳答案

不,以前从未见过,它肯定看起来像是个错误。四舍五入到小数点后两位的0.00009应该绝对是0.00
ROUND_HALF_DOWN不应更改行为,因为您不处理中点值。

This link有更多详细信息。

在1.9中修复的1.8级别中似乎有一个错误。这有点奇怪,因为它似乎只影响第一个非零数字之前的偶数个零的数字,并且仅当该数字等于或大于5时才起作用。

根据提供的数据,这似乎正是您的问题。

10-04 12:15