是什么原因导致 BigDecimal.divide 的“非终止十进制扩展”异常?非终止小数需要舍入

2022-09-01 10:14:43

我以前使用过BigDecimals,但不经常,今天早上我正在做一些事情,我一直得到以下例外:

Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion;
no exact representable decimal result.
    at java.math.BigDecimal.divide(BigDecimal.java:1594)

我试图设置比例并使用舍入来消除问题,如下所示:

    BigDecimal bd1 = new BigDecimal(1131).setScale(2,BigDecimal.ROUND_HALF_UP);
    BigDecimal bd2 = new BigDecimal(365).setScale(2,BigDecimal.ROUND_HALF_UP);
    BigDecimal bd3 = bd1.divide(bd2).setScale(2,BigDecimal.ROUND_HALF_UP);
    System.out.println("result: " + bd3);

但是,我不断得到同样的例外。有人能够向我展示我在哪里犯了错误吗?


答案 1

非终止小数需要舍入

使用除法时,您应该将MathContext舍入模式结合使用,以防确切的结果具有无限个小数。

您的情况就是如此:

MathContext mc = new MathContext(2, RoundingMode.HALF_UP) ;
BigDecimal bd3 = bd1.divide(bd2, mc);

或者,使用舍入模式调用除法以使用分子的尺度(在下面的示例中):bd1

BigDecimal bd3 = bd1.divide(bd2, RoundingMode.HALF_UP);

答案 2

这就是问题所在

bd1.divide(bd2)

您需要使用采用舍入模式(以各种形式)的重载方法之一 - 您无法在除法后进行舍入,因为对于非终止分数,中间结果要么已经需要舍入,要么需要无限存储空间。divide()