除法运算ArithmeticException: Non-terminating decimal expansion

一、背景

今天在计算库存消耗百分比(消耗的库存/总库存)的时候遇到了一个错误,
java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.

通过异常的描述,我们知道这是因为,某些场景下对于如1/3会得到一个无穷小数,这个时候需要定义计算结果要保留到小数点后几位,否则就会抛出上面的异常。

二、方法介绍


出现异常时使用的方法,此方法没有精度设置。


public BigDecimal divide(BigDecimal divisor) 


在进行除法运算的时候,我们需要使用下面的方法来进行精度控制。


public BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)

附:不要忘记判断分母是否为0  

三、代码如下

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());
}  

我是「翎野君」,感谢各位朋友的:点赞收藏评论,我们下期见。

相关文章

java向上向下取整

在java开发当中会经常使用小数点计算的问题,这是需要知道java中向上向下取整,如下:向上取整用Math.ceil(double a)向下取整用Math.floor(double a)举例:publ...

一文学会Python中的运算规则!

目录一、基本赋值运算符二、数值运算函数三、数字类型的关系四、附小知识一、基本赋值运算符a +=b => a=a+ba -=b => a=a-ba *=b => a=a*ba /=b...

BigDecimal 详解

BigDecimal 详解《阿里巴巴 Java 开发手册》中提到:“为了避免精度丢失,可以使用 BigDecimal 来进行浮点数的运算”。浮点数的运算竟然还会有精度丢失的风险吗?确实会!示例代码:f...