划分时Java中的某些BigDecimal数会导致抛出ArithmeticException

时间:2012-07-28 23:14:22

标签: java bigdecimal arithmeticexception

以下方法可以分割两个BegDecimal数字。

BigDecimal a=new BigDecimal(5);
BigDecimal b=new BigDecimal(2);
System.out.println(a.divide(b));

输出:2.5


然而,以下相同的方法因java.lang.ArithmeticException

而失败
BigDecimal c=new BigDecimal(361);
BigDecimal d=new BigDecimal(6);
System.out.println(c.divide(d));

以下是完整的异常堆栈跟踪。

Exception in thread "main" java.lang.ArithmeticException:
Non-terminating decimal expansion; no exact representable decimal result.
    at java.math.BigDecimal.divide(BigDecimal.java:1603)
    at currenttime.Main.main(Main.java:15)
Java Result: 1

解决方案是什么?

3 个答案:

答案 0 :(得分:2)

这是Java规范的预期。你没有提供任何比例,因为361/6 = 60.1(6)它应该抛出那个例外。如果你想要一些舍入,你应该提供一个比例,即小数点后面的数字返回,或者你可能想要devideAndReminder用提醒来划分。

答案 1 :(得分:2)

你可以说,小数点后5位:

BigDecimal c=new BigDecimal(361);
BigDecimal d=new BigDecimal(6);
System.out.println(c.divide(d, 5, BigDecimal.ROUND_HALF_EVEN));

答案 2 :(得分:1)

如果商是非终止小数(361/6是60.1666666 ......),则一个参数BigDecimal.Divide会抛出ArithmeticException

  

抛出:
   ArithmeticException - 如果确切的商没有   终止十进制扩展

要避免这种情况,请使用带有第二个overload参数的RoundingMode

即,你告诉BigDecimal你对分割结果的期望是什么。