今天在计算库存消耗百分比(消耗的库存/总库存)的时候遇到了一个错误,java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.java
经过异常的描述,咱们知道这是由于,某些场景下对于如1/3会获得一个无穷小数,这个时候须要定义计算结果要保留到小数点后几位,不然就会抛出上面的异常。ide
出现异常时使用的方法,此方法没有精度设置。spa
public BigDecimal divide(BigDecimal divisor)
复制代码
在进行除法运算的时候,咱们须要使用下面的方法来进行精度控制。code
public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)
复制代码
附:不要忘记判断分母是否为0 ci
BigDecimal b1 = new BigDecimal(1);
BigDecimal b2 = new BigDecimal(3);
if (!Objects.equals(b2, BigDecimal.ZERO)) {
// 不能整除,数学上是无穷小数,抛出ArithmeticException异常
//BigDecimal b3 = b1.divide(b2);
// 指定计算结果的精度,保留到小数点后几位,以及舍入模式
BigDecimal b3 = b1.divide(b2, 4, BigDecimal.ROUND_HALF_UP);
System.out.println(b3.toEngineeringString());
}
复制代码