質問

BigDecimalのように表されます値を使用してテストを書いている間、私は奇妙な何かに走り、それを掘り下げることにしました。簡単に言えば、「0.00009」は、2つの小数点以下に丸め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以上である場合にのみ、少し奇妙な1中です。

これは、提供されたデータに基づいて、あなたの問題は、の正確のように見えます。

他のヒント

私が思うに、これはあまりにもバグですが、何私が疑問に思うことは、結果を表示する.to_fです。私はあなたがBigDecimalの代わりにフロートを使用する理由を持っていると思いますので、BigDecimalのを使用すると、代わりに.to_s(「F」)を使用する必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top