1
私はすでにthis asnwerを見てきました。BigDecimal.valueOf(float)はどのように機能しますか?
私は少し振る舞いによって混乱していたBigDecimal.valueOf(float)
です。ここでは例です:
System.out.println(BigDecimal.valueOf(20.2f)); //prints 20.200000762939453
したがって
float f = BigDecimal.valueOf(20.2f)
.setScale(2, RoundingMode.UP)
.floatValue();
System.out.println(f); //prints 20.21
defenitely私が期待される動作されていません。 round up
がこのようなエラーを正しく回避する方法がありますか?予想通り - - それは受信したすべての数字を保持しますが、それはの精度を推測することはできませんフロートの説明とそれがどのように割り当てられたビットは How many significant digits have floats and doubles in java?
のBigDecimalが正常に動作してを参照してください利用するために
を見てみましょう[小数点演算が壊れて浮いていますか?](http://stackoverflow.com/questions/588004/is-floating-point-math-壊れた)。有限精度の浮動小数点数は、本来、ある値を表すことはできません。これは1/10が10進数で正確に表現されない方法に幾分似ています。ここでは '20.2f!= 20.2'です。 – Zong
@ZongZhengLiとても面白いです。だから私は浮動小数点演算を扱い、正確な精度を保つために、算術演算を実行するたびにROUND_EVENを実行する必要がありますか? – stella
予想される出力は何ですか?それは私には正しいと思われる20.200000762939453小数点以下2桁に切り上げ20.21です。ラウンドでもスケールをより大きな数値に設定し、ラウンドアップで2に設定することもできます – samgak