1

以下将两个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

解决方案是什么?

4

3 回答 3

2

这符合 Java 规范的预期。您没有提供任何比例,并且由于 361/6 = 60.1(6) 它应该抛出该异常。如果你想要一些四舍五入,你应该提供一个比例,这意味着要返回小数点后多少位,或者你可能需要 dedeAndReminder 来除以提醒。

于 2012-07-28T23:21:05.620 回答
2

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

BigDecimal c=new BigDecimal(361);
BigDecimal d=new BigDecimal(6);
System.out.println(c.divide(d, 5, BigDecimal.ROUND_HALF_EVEN));
于 2012-07-28T23:25:24.343 回答
1

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

抛出:
ArithmeticException - 如果精确商没有终止的小数扩展

为了避免这种情况,请使用overload第二个RoundingMode参数。

即,您准确地告诉 BigDecimal 您对除法结果的期望。

于 2012-07-28T23:19:11.123 回答