一尘不染

ArithmeticException:“不终止的十进制扩展;没有确切可表示的小数结果”

java

为什么以下代码会引发如下所示的异常?

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.

阅读 483

收藏
2020-03-09

共1个答案

一尘不染

从Java 11 BigDecimal文档:

当为MathContext对象提供的精度设置为0(例如MathContext.UNLIMITED)时,算术运算是精确的,不带MathContext对象的算术方法也是如此。(这是5之前的版本中唯一支持的行为。)

作为计算精确结果的必然结果,MathContext不使用精度设置为0 的对象的舍入模式设置,因此不相关。在除法的情况下,精确的商可以具有无限长的十进制扩展;例如1除以3。

如果商具有不间断的十进制扩展数,并且指定了该操作以返回精确的结果,ArithmeticException则将引发an 。否则,将返回除法的精确结果,就像其他操作一样。

要解决此问题,你需要执行以下操作:

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

其中2是小数位数,RoundingMode.HALF_UP是四舍五入模式

2020-03-09