Java中的某些BigDecimal数字在被除时会引发算术异常

Java中的某些BigDecimal数字在被除时会引发算术异常,java,bigdecimal,arithmeticexception,Java,Bigdecimal,Arithmeticexception,以下两个十进制数的除法效果良好 BigDecimal a=new BigDecimal(5); BigDecimal b=new BigDecimal(2); System.out.println(a.divide(b)); 产出:2.5 但是,以下相同的方法在java.lang.arithmetricException中失败 以下是完整的异常堆栈跟踪 Exception in thread "main" java.lang.ArithmeticException: Non-terminati

以下两个十进制数的除法效果良好

BigDecimal a=new BigDecimal(5);
BigDecimal b=new BigDecimal(2);
System.out.println(a.divide(b));
产出:2.5

但是,以下相同的方法在java.lang.arithmetricException中失败

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

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
解决方案是什么?

如果商是非终止小数361/6是60.1666666…,则一个参数会引发算术异常:

抛出: 算术异常-如果精确商没有 终止十进制扩展

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

也就是说,您准确地告诉BigDecimal您希望从除法结果中得到什么。

如果商是非终止小数361/6是60.1666666,则one参数会引发算术异常:

抛出: 算术异常-如果精确商没有 终止十进制扩展

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


也就是说,您准确地告诉BigDecimal您对除法结果的期望值。

这是Java规范所期望的。您没有提供任何刻度,并且由于361/6=60.16,它应该抛出该异常。如果您需要一些舍入,您应该提供一个刻度,表示小数点后返回多少位,或者您可能需要DeviceAndReminder用于带提醒的除法。

这是Java规范所期望的。您没有提供任何刻度,并且由于361/6=60.16,它应该抛出该异常。如果要进行舍入,则应提供小数点后返回的位数,或者需要设备和提醒器进行除法。

可以将小数点舍入到5位:

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

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

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

您需要设置舍入模式。否则默认为精确。更多信息:您需要设置舍入模式。否则默认为精确。详细信息: