2016-05-29 12 views
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が正常に動作してを参照してください利用するために

+0

を見てみましょう[小数点演算が壊れて浮いていますか?](http://stackoverflow.com/questions/588004/is-floating-point-math-壊れた)。有限精度の浮動小数点数は、本来、ある値を表すことはできません。これは1/10が10進数で正確に表現されない方法に幾分似ています。ここでは '20.2f!= 20.2'です。 – Zong

+0

@ZongZhengLiとても面白いです。だから私は浮動小数点演算を扱い、正確な精度を保つために、算術演算を実行するたびにROUND_EVENを実行する必要がありますか? – stella

+0

予想される出力は何ですか?それは私には正しいと思われる20.200000762939453小数点以下2桁に切り上げ20.21です。ラウンドでもスケールをより大きな数値に設定し、ラウンドアップで2に設定することもできます – samgak

答えて

4

与えられた議論。したがって:

float f = 20.20f; 
    System.out.println("Float: "+f); 
    System.out.println("BigDecimal.valueOf: "+BigDecimal.valueOf(f)); 
    System.out.println("BigDecimal from value: "+new BigDecimal(f, MathContext.DECIMAL32)); 
    System.out.println("BigDecimal from string: "+new BigDecimal(""+f));; 

プリント:

Float: 20.2 
BigDecimal.valueOf: 20.200000762939453 
BigDecimal from value: 20.20000 
BigDecimal from string: 20.2 
関連する問題