ArithmeticException の詳細: 非終了除算
提供されたコード スニペットは、2 つの BigDecimal オブジェクト (a と b) を除算しようとします。 )。ただし、この操作により次の例外が発生します。
java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
この例外を解明するには、BigDecimal 算術演算の複雑な詳細を詳しく調べる必要があります。
正確な算術演算の本質
Java 11 BigDecimal に記載されているとおりドキュメントによると、MathContext オブジェクトの精度が 0 に設定されている場合 (MathContext.UNLIMITED など)、算術演算 (MathContext を使用しない除算を含む) は正確な結果を生成します。これは、5 より前のリリースの唯一の動作でした。
無限小数展開と正確性
正確な結果を計算した結果、MathContext オブジェクトの丸めモード設定精度 0 では無関係になります。除算演算の場合、商は 1 を 3 で割るなど、無限の小数展開を持つ可能性があります。
非終了展開の処理
商に非終了展開がある場合-10 進展開を終了し、正確な結果を返すために操作が必要な場合は、ArithmeticException がスローされます。逆に、結果が有限の場合は正確な商が返されます。
非終了除算の解決策
この問題を修正するには、次のような方法を使用できます。
a.divide(b, 2, RoundingMode.HALF_UP)
ここで、2 はスケールを表し、RoundingMode.HALF_UP は
追加リソース
さらに詳しく理解するには、Java 11 BigDecimal ドキュメントとこの洞察力に富んだブログ投稿を参照してください。
以上が「BigDecimal」除算が非終了小数に対して「ArithmeticException」をスローするのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。