次のコードで以下に示す例外が発生するのはなぜですか?
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
オブジェクトに精度設定が0で指定されている場合
MathContext
(例:MathContext.UNLIMITED
) では、算術演算は正確であり、オブジェクトを受け取らない算術メソッドも同様ですMathContext
。(これは、5 より前のリリースでサポートされていた唯一の動作です。)正確な結果を計算する結果として、精度設定が 0 のオブジェクトの丸めモード設定は
MathContext
使用されず、無関係になります。除算の場合、正確な商は、たとえば 1 を 3 で割った場合のように、無限に長い小数展開を持つ可能性があります。商に非終端小数展開があり、演算が正確な結果を返すように指定されている場合は、が
ArithmeticException
スローされます。それ以外の場合は、他の演算の場合と同様に、除算の正確な結果が返されます。
修正するには、次のようにする必要があります。
a.divide(b, 2, RoundingMode.HALF_UP)
ここで、2はスケール、RoundingMode.HALF_UPは丸めモードです。
詳細についてはこのブログ投稿。