深入探討 ArithmeticException:非終止除法
程式碼片段嘗試將兩個 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。
處理非終止展開
如果商有非終止展開- 終止十進制擴展並且操作需要返回精確結果,則拋出 ArithmeticException。相反,如果結果是有限的,則返回精確的商。
非終止除法的解決方案
要修正這個問題,您可以採用以下方法:
a.divide(b, 2, RoundingMode.HALF_UP)
這裡,2代表比例, RoundingMode.HALF_UP指定舍入方法。
其他資源
深入了解要了解這一點,請參閱 Java 11 BigDecimal 文件和這篇富有洞察力的部落格文章。
以上是為什麼「BigDecimal」除法會對非終止小數拋出「ArithmeticException」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!