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

解决方案是什么?

这是Java规范所期望的。您没有提供任何规模,由于361/6=60.1(6),它应该抛出该异常。如果你想要一些四舍五入,你应该提供一个小数点后的小数位数,或者你可能想要devideAndReminder来除以reminder。

你可以说,四舍五入到小数点后5位:

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

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

投掷:
ArithmeticException-如果精确的商没有终止十进制扩展

为了避免这种情况,使用具有第二个RoundingMode参数的overload

也就是说,你告诉BigDecimal你对除法结果的期望。

最新更新