2017-07-12 3 views
-2

BigDecimalが期待値の代わりに半分を四捨五入した後にこの値を返すのはなぜですか?BigDecimalは、この値を半分に丸めた後に戻すのはなぜですか?

// EXPECTED 0.45 
// RETURNS 0.45 
System.out.println(BigDecimal.valueOf(Double.parseDouble("0.45")) 
          .setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString()); 

// EXPECTED 0.45 
// RETURNS 0.45 
System.out.println(BigDecimal.valueOf(Double.parseDouble("0.445")) 
          .setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString()); 

// EXPECTED 0.45 
// RETURNS 0.44 
System.out.println(BigDecimal.valueOf(Double.parseDouble("0.4445")) 
          .setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString()); 
+5

ラウンド(0.4445)= 0.44は問題ありません。なぜ0.4445が0.45になるのですか? – NikNik

+4

0.44は0.4545に近い0.4445になります。 – luk2302

+0

丸め演算は、最初の破棄された端数で行われますが、すべての破棄された端数で再帰的に行われるわけではありません。あなたは丸めが0.4445-> 0.445-> 0.45になると予想したと思います。しかし、他の人が既に指摘しているように、これは実際にあなたに恐ろしい結果を与えるでしょう。 –

答えて

1

これは文字通りの質問

なぜBigDecimalのではなく、期待値の を半分を切り上げた後、この値を返さないとどのように私はこれを達することができる?への答えでありますか

0.4445が「期待値」0.45ではなく0.44に丸められて適用されています。

BigDecimal.ROUND_HALF_UPは、両方の 隣人が、その場合には切り上げ、等距離である場合を除き、「最近傍」に向けて丸める

丸めモードとして定義されています。

2倍の倍率は0.44と0.45です。 0.4445と0.44の間の絶対差は0.0045です。 0.4445と0.45との間の絶対差は0.0055である。隣人は等距離ではなく、0.44は最も近い隣人です。

本当に奇妙で不必要に不正確な丸めモードが必要な場合は、BigDecimalのtoStringメソッドを使用して完全な文字列表現を取得します。文字列操作を使用して好きな方法でそれをマングルすることができます。

+0

文字列を使用することも可能です。または、彼は 'setScale()'を繰り返し使用することができます。高さから開始し、目標スケールに達するまで縮尺を減らします。それは '0.4445 - > 0.445 - > 0.45'となります。 –

+0

@RudyVelthuisはい、この特定のケースではうまくいくでしょう。しかし、次回OPが誤った倍数を目標値として強制的に印刷したい場合、別の操作が必要になることがあります。 Stringアプローチはより柔軟です。 –

+0

もちろん、文字列で初期化されたdoubleを使ってBigDecimalを初期化することは決して良い考えではありません。しかし、同じ操作が必要となるISTM。 –

関連する問題