9

在编写一个用 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

有没有人见过这样的事情?

4

2 回答 2

6

不,以前从未见过,而且它绝对看起来像一个错误。0.00009绝对应该四舍五入到小数点后两位0.00

不应该改变行为,ROUND_HALF_DOWN因为您没有处理中点值。

这个链接有更多细节。

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

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

于 2010-01-13T02:50:31.737 回答
0

我认为,这也是一个错误,但我想知道的是 .to_f 来显示结果。使用 BigDecimal 你应该使用 .to_s('F') 代替,因为我猜你有理由使用 BigDecimal 而不是 Floats。

于 2010-03-31T10:47:59.207 回答