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