目 录CONTENT

文章目录

BigDecimal知识回顾

在水一方
2022-02-11 / 0 评论 / 0 点赞 / 978 阅读 / 1,591 字 / 正在检测是否收录...

介绍

我们之前做的民生银行的培训系统时大量的用到了BigDecimal用于计算学分和金额等数据,那为什么这类数据不用double而是用Bigdecimal,接下来进行小结一下

Bigdecimal是java.math包下的一个类,不可变的、任意精度的有符号十进制数,BigDecimal类使用户能完全控制舍入行为,如果需要精确计算的结果,则必须使用BigDecimal

BigDecimal 的等值比较应使用 compareTo()方法,而不是 equals()方法

说明:equals()方法会比较值和精度(1.0 与 1.00 返回结果为 false),而 compareTo()则会忽略精度

    @Test
    public void bigDecimal1(){
        BigDecimal h = new BigDecimal("0.00");
        BigDecimal k = BigDecimal.ZERO;
        System.out.println(h.compareTo(k)==0);
        System.out.println(h.equals(k));

    }

输出结果:
true
false

BigDicimal的加减乘除

@Test
    public void bigDecimal(){
        BigDecimal a = new BigDecimal("2.12");
        BigDecimal b = new BigDecimal("0.2");
        //加法
        BigDecimal c = a.add(b);
        // 减法
        BigDecimal d = a.subtract(b);
        // 乘法
        BigDecimal e = a.multiply(b);
       double ff = e.doubleValue(); // 转换成double类型的值
        // 除法,
        BigDecimal f = a.divide(b);
    }

注意点:如果new new BigDecimal(1.0);中的值是int类型,那么计算出来也是有问题的见以下案例

   @Test
    public void bigDecimal1(){
        BigDecimal h = new BigDecimal(1.0);
        BigDecimal k = new BigDecimal(0.9);
        BigDecimal test = h.subtract(k);
        System.out.println(test);
    }

输出的值为:0.09999999999999997779553950749686919152736663818359375

两个BigDecimal值如果除不尽就会报错,见截图
image.png

java开发手册规约

【强制】禁止使用构造方法 BigDecimal(double)的方式把 double 值转化为 BigDecimal 对象
说明:BigDecimal(double)存在精度损失风险,在精确计算或值比较的场景中可能会导致业务逻辑异常。
如:BigDecimal g = new BigDecimal(0.1F); 实际的存储值为:0.10000000149
正例:优先推荐入参为 String 的构造方法,或使用 BigDecimal 的 valueOf 方法,此方法内部其实执行了
Double 的 toString,而 Double 的 toString 按 double 的实际能表达的精度对尾数进行了截断。
BigDecimal recommend1 = new BigDecimal("0.1");
BigDecimal recommend2 = BigDecimal.valueOf(0.1);

用double进行小数的加减乘除会有什么问题

  @Test
    public void doubleTest(){
        double a = 1.0;
        double b = 0.9;
        double c = a - b;
        System.out.println(c);
    }

得出的结果为:0.09999999999999998 应该得出的值为0.1这里得出的是一个近似0.1的值
0

评论区