ArithmeticException: 「非終了小数展開。正確に表現できる小数の結果がありません」 質問する

ArithmeticException: 「非終了小数展開。正確に表現できる小数の結果がありません」 質問する

次のコードで以下に示す例外が発生するのはなぜですか?

BigDecimal a = new BigDecimal("1.6");
BigDecimal b = new BigDecimal("9.2");
a.divide(b) // results in the following exception.

例外:

java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.

ベストアンサー1

からJava 11BigDecimalドキュメント:

オブジェクトに精度設定が0で指定されている場合MathContext(例:MathContext.UNLIMITED) では、算術演算は正確であり、オブジェクトを受け取らない算術メソッドも同様ですMathContext。(これは、5 より前のリリースでサポートされていた唯一の動作です。)

正確な結果を計算する結果として、精度設定が 0 のオブジェクトの丸めモード設定はMathContext使用されず、無関係になります。除算の場合、正確な商は、たとえば 1 を 3 で割った場合のように、無限に長い小数展開を持つ可能性があります。

商に非終端小数展開があり、演算が正確な結果を返すように指定されている場合は、がArithmeticExceptionスローされます。それ以外の場合は、他の演算の場合と同様に、除算の正確な結果が返されます。

修正するには、次のようにする必要があります

a.divide(b, 2, RoundingMode.HALF_UP)

ここで、2はスケール、RoundingMode.HALF_UPは丸めモードです。

詳細についてはこのブログ投稿

おすすめ記事