红宝石的BigDecimal回合:这是一个错误?
-
20-09-2019 - |
题
在写与被表示为一个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
不应该改变的行为。
此链接有更多详细信息。
这似乎是在一个已经固定在1.9 1.8级别的错误。这是一个略微奇异一个,它似乎只在第一非零数字之前且仅当该数字是5或更大。
影响具有偶数个零的数这似乎是准确基于该数据的问题提供。
其他提示
我觉得,这是一个bug太多,但我想知道的是,显示结果.to_f。随着BigDecimal的你应该使用.to_s(“F”),而不是因为我想你必须使用的,而不是花车BigDecimal的一个原因。
不隶属于 StackOverflow