zoukankan      html  css  js  c++  java
  • 除法运算时的一个常见异常之java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.

    一、背景

    今天在计算库存消耗百分比(消耗的库存/总库存)的时候遇到了一个错误,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());
    }  

      

  • 相关阅读:
    ListView点击事件
    ListView优化:
    自定义ListView
    ListView简单使用
    mysql中show processlist过滤和杀死线程
    自定义控件
    yum配置中driver-class-name: com.mysql.jdbc.Driver报错
    CSS+HTML
    maven的配置
    Model、ModelMap、ModelAndView的作用及区别
  • 原文地址:https://www.cnblogs.com/lingyejun/p/11588685.html
Copyright © 2011-2022 走看看