2017-03-03 12 views
1

HALF_EVEN i javaの丸めの問題をデバッグしようとしましたが、 のように、予期しない結果が377.35であり、Java Math RoundingMode.HALF_EVENが予期しない結果を表示する

誰かが行動を説明するのに役立つことができますか?あなたが最初の場所でdoubleに渡していて、それはすべてあなたがしたくない丸めないため

public static void main(String[] args) { 


    System.out.println((new BigDecimal(0.3450)).setScale(2, RoundingMode.HALF_EVEN).toPlainString()); 
    //prints 0.34 

    System.out.println((new BigDecimal(77.3450)).setScale(2, RoundingMode.HALF_EVEN).toPlainString()); 
    //prints 77.34 

    System.out.println((new BigDecimal(377.3450)).setScale(2, RoundingMode.HALF_EVEN).toPlainString()); 
    **//prints 377.35 ?????** 

    //anything larger than 256 is printing .35 
    System.out.println((new BigDecimal(255.3450)).setScale(2, RoundingMode.HALF_EVEN).toPlainString()); 
    //prints 255.34 

    System.out.println((new BigDecimal(256.3450)).setScale(2, RoundingMode.HALF_EVEN).toPlainString()); 
    **//prints 256.35 ?????** 


} 
+0

@JonnyHenly私はそれが同じ質問だと思います。ありがとう。 – Yonggang

答えて

2
new BigDecimal(377.3450) 

だけでこのラインは、、BigDecimalのすべての利点を失います。

書き込み、代わりに、

new BigDecimal("377.3450") 

...と、一般的にどこでもStringコンストラクタを使用します。 「正しい」答えが得られた場合、浮動小数点の丸めはとなり、となり、正しい方向に進みました。

0

浮動小数点数の仕組みによるものです。 256.3450と表示されていますが、その数は明らかに浮動小数点数として正しく表現できません。 Stringnew BigDecimal("256.3450"))を使用すると、四捨五入は期待通りに機能します。