1. ホーム
  2. java

[解決済み] ArithmeticExceptionです。"10進展開が終了しない; 正確に表現できる10進の結果がない"

2022-01-30 18:52:25

質問

以下のコードでは、なぜ以下のような例外が発生するのでしょうか?

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.

解決方法は?

からの ジャバ11 BigDecimal ドキュメント :

を使用した場合 MathContext オブジェクトが精度設定 0 で提供されている場合(例えば。 MathContext.UNLIMITED を取らない算術メソッドと同様に、算術演算は正確です。 MathContext オブジェクトを作成します。(これは5より前のリリースでサポートされていた唯一の動作です)。

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

商が終端でない小数展開を持ち、演算が正確な結果を返すように指定されている場合、その商は ArithmeticException が投げられます。そうでない場合は、他の操作と同様に正確な除算結果が返されます。

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

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

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

詳細は以下をご覧ください。 このブログの記事 .