ArithmeticException:“非终止十进制扩展;没有精确可表示的十进制结果“

问题:

为什么下面的代码会引发下面的异常呢?

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 5文档(Java 8 docs here):

当MathContext对象的精度设置为0(例如MathContext.UNLIMITED)时,算术运算是精确的,不使用MathContext对象的算术方法也是如此。 (这是在5之前版本中支持的唯一行为)
作为计算精确结果的推论,不使用精确设置为0的MathContext对象的舍入模式设置,因此无关紧要。在分割的情况下,确切的商可以具有无限长的十进制扩展;例如1除以3。
如果商具有非终止十进制扩展,并且指定操作以返回精确的结果,则抛出ArithmeticException。否则,返回除法的确切结果,与其他操作一样。

 要修复,你需要做这样的事情

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

where 2 is precision and RoundingMode.HALF_UP is rounding mode

更多细节:http://jaydeepm.wordpress.com/2009/06/04/bigdecimal-and-non-terminating-decimal-expansion-error/

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: ArithmeticException: “Non-terminating decimal expansion; no exact representable decimal result”

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

77 − = 75