为什么以下代码会引发如下所示的异常?
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.
来自Java 11BigDecimal文档:
BigDecimal
当MathContext对象的精度设置为 0(例如)时,算术运算是精确的,就像不带对象MathContext.UNLIMITED的算术方法一样。MathContext(这是 5 之前的版本中唯一支持的行为。) 作为计算精确结果的必然结果,MathContext不使用精度设置为 0 的对象的舍入模式设置,因此不相关。在除法的情况下,精确商可以有一个无限长的小数展开;例如,1 除以 3。 如果商具有非终止的十进制扩展并且指定操作返回精确结果,ArithmeticException则抛出 an。否则,将返回除法的确切结果,就像其他操作一样。
当MathContext对象的精度设置为 0(例如)时,算术运算是精确的,就像不带对象MathContext.UNLIMITED的算术方法一样。MathContext(这是 5 之前的版本中唯一支持的行为。)
MathContext
MathContext.UNLIMITED
作为计算精确结果的必然结果,MathContext不使用精度设置为 0 的对象的舍入模式设置,因此不相关。在除法的情况下,精确商可以有一个无限长的小数展开;例如,1 除以 3。
如果商具有非终止的十进制扩展并且指定操作返回精确结果,ArithmeticException则抛出 an。否则,将返回除法的确切结果,就像其他操作一样。
ArithmeticException
要修复,您需要执行以下操作 :
a.divide(b, 2, RoundingMode.HALF_UP)
其中 2 是比例,RoundingMode.HALF_UP 是舍入模式