查看此代码。它适用于像704这样的数字,但从705开始获得不可能的错误:
import java.math.*;
public class Test {
public static void main(String[] argv) throws Exception {
BigDecimal totalDuration = new BigDecimal(705);
int scale = 2;
MathContext mc = new MathContext(scale, RoundingMode.HALF_UP);
System.out.println(totalDuration.divideAndRemainder(new BigDecimal(5), mc));
}
}
我正在使用JDK11。
错误:
Exception in thread "main" java.lang.ArithmeticException: Division impossible
at java.base/java.math.BigDecimal.divideToIntegralValue(BigDecimal.java:1880)
at java.base/java.math.BigDecimal.divideAndRemainder(BigDecimal.java:2012)
at Test.main(Test.java:9)
您是否检查了BigDecimal.divideAndRemainder
的文档?
它说:
抛出 arithmeticexception 如果结果不确切,但圆形模式不必要,或者mc.precision> 0 and and this.dividetetointgralvalue(divisor)的精度超过精度超过精度。MC.Precision Digits。
因此,int scale = 2;
不够用于此操作,如果将其更改为 int scale = 3;
,它可以很好地工作。
705/5 == 141,而141不能表示为2位数字。
文档说:
如果确切商的整数部分不仅需要精确数字,算术算法是抛弃的。
(温和释义)
您需要更精确。当scale
为3。
704可能是因为整数部分 can 表示为两个数字: 1.4E+2
。