为什么Java中两个BigDecimal数字的划分会抛出ArithmeticException?

Lio*_*ion 7 java

我们来看看Java中的以下代码片段.

package division;

import java.math.BigDecimal;

final public class Main
{
    public static void main(String[] args)
    {
        BigDecimal a = new BigDecimal(2);
        BigDecimal b = new BigDecimal(3);

        System.out.println(a.multiply(b));
        System.out.println(a.add(b));
        System.out.println(b.subtract(a));
        System.out.println(a.divide(b));
    }
}
Run Code Online (Sandbox Code Playgroud)

在上面的代码片段中,除最后一个(除法)之外的所有操作都成功执行.试图BigDecimal在Java中划分两个数字会引发争议java.lang.ArithmeticException.为什么?这个问题的解决方案是什么?

mae*_*ics 14

BigDecimal#divide(BigDecimal)文档:

...如果无法表示确切的商(因为它具有非终止的十进制扩展),则抛出ArithmeticException.

在您的特定情况下,"2/3"具有非终止十进制扩展(0.6666 ...),因此您必须使用一种形式,divide()其中采用比例和/或RoundingMode解析无限表示.例如:

BigDecimal a = new BigDecimal(2);
BigDecimal b = new BigDecimal(3);
a.divide(b, 4, RoundingMode.CEILING); // => 0.6667
a.divide(b, 4, RoundingMode.FLOOR);   // => 0.6666
Run Code Online (Sandbox Code Playgroud)