为什么以下代码会引发下面显示的异常?
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.
9 回答
来自Java 8文档:
To fix, you need to do something like this :
更多细节:http://jaydeepm.wordpress.com/2009/06/04/bigdecimal-and-non-terminating-decimal-expansion-error/
因为您没有指定精度和舍入模式 . BigDecimal抱怨它可以使用10,20,000,或无限小数位,但它仍然无法准确表示数字 . 因此,它不会给你一个不正确的BigDecimal,它只会对你产生影响 .
但是,如果你提供一个RoundingMode和一个精度,那么它将能够转换(例如1.333333333到无穷大到类似于1.3333 ...但是你作为程序员需要告诉它你对'满意'的准确度” .
你可以做
您可以选择所需的位数32,64,128 .
看看这个链接:
http://edelstein.pebbles.cs.cmu.edu/jadeite/main.php?api=java6&state=class&package=java.math&class=MathContext
为了解决这个问题我在下面的代码中使用过
2是精度 . 现在问题解决了 .
我有同样的问题,因为我的代码行是:
我改为这个,阅读之前的答案,因为我没有写小数精度:
4是Decimal Precion
AND RoundingMode是枚举常量,你可以选择任何一个
UP, DOWN, CEILING, FLOOR, HALF_DOWN, HALF_EVEN, HALF_UP
在这个案例HALF_UP中,将得到以下结果:
你可以在这里查看
RoundingMode
信息:http://www.javabeat.net/precise-rounding-of-decimals-using-rounding-mode-enumeration/回答BigDecimal throws ArithmeticException
在divide方法调用中添加MathContext对象并调整精度和舍入模式 . 这应该可以解决您的问题
这是一个舍入结果的问题,我的解决方案如下 .
这是因为Bigdecimal没有丢失,例如,如果你除以1/3,它将导致重复的十进制到无穷大 . 0.33333333 ...理论上如果你再乘以,你会得到确切的结果 . 但是,无穷大数字将生成堆栈溢出流,在这种情况下启动异常 .
我的解决方案
在这种情况下,Rounding不会削减您的结果
您的程序不知道使用十进制数的精度,因此它抛出:
绕过异常的解决方案: