Ruby BigDecimal Round:这是一个错误吗?

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

有人见过这样的情况吗?

我无法在我的1.8.7环境中重现它(ruby 1.8.7 (2009-06-12 patchlevel 174) [x86_64-linux])。 - bryantsai
2个回答

6
不,我以前从未见过这种情况,这明显是个bug。0.00009保留两位小数应该是0.00
由于你没有处理中间值,因此ROUND_HALF_DOWN不应更改行为。 此链接提供了更多详细信息。
这似乎是1.8版本中的一个bug,在1.9中已经修复。这是一个有点奇怪的问题,只影响在第一个非零数字之前有偶数个零且该数字大于或等于5的数字。
根据所提供的数据,这似乎恰好是你的问题。

是的,这似乎确实是我的问题!感谢您的侦探工作! - Peter Degen-Portnoy

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接