9

BigDecimal として表される値を使用してテストを作成しているときに、奇妙なことに遭遇し、それを掘り下げることにしました。つまり、「0.00009」を小数点第 2 位に四捨五入すると、0.00 ではなく 0.01 として返されます。本当。これが私のスクリプト/コンソールのキャプチャです:

>> 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小数点以下第 2 位に丸めると、間違いなく になります0.00

ROUND_HALF_DOWN中間値を扱っていないため、動作を変更する必要はありません。

このリンクには詳細があります。

1.9 で修正された 1.8 レベルのバグのようです。これは、最初の非ゼロ桁の前に偶数個のゼロがあり、その桁が 5 以上の場合にのみ影響するように見えるという点で、少し奇妙なものです。

提供されたデータに基づいて、それはまさにあなたの問題のようです。

于 2010-01-13T02:50:31.737 に答える
0

これもバグだと思いますが、気になるのは結果を表示する.to_fです。BigDecimalでは、Floatsの代わりにBigDecimalを使用する理由があると思うので、代わりに.to_s('F')を使用する必要があります。

于 2010-03-31T10:47:59.207 に答える