BigDecimal实际开发的三坑是什么

描述

坑1:初始化使用double类型数据

public class TestBigDecimal {
    public static void main(String[] args){
        BigDecimal b1=new BigDecimal(0.22);
        BigDecimal b2=new BigDecimal("0.22");
        System.out.println("b1的值:"+b1);
        System.out.println("b2的值:"+b2);
    }
}

结果

b1的值:

0.2200000000000000011102230246251565404236316680908203125

b2的值:0.22

原因:

构造方法参数为double类型有一定的不可预知性,表面上看是0.22,实际上是0.2200000000000000011102230246251565404236316680908203125,0.22在java中无法准确的表示为double

解决方案:

1.采用String 类型的构造参数。

2.如果必须要使用double,则可使用Double.toString(double) 方法转换成String, 再采用Bigdecimal的构造函数.

坑2:除法计算

public static void t1(){
    BigDecimal b1=new BigDecimal("10");
    BigDecimal b2=new BigDecimal("3");
    System.out.println(b1.divide(b2).setScale(2,BigDecimal.ROUND_HALF_UP));
}

结果:

Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result

原因:

当遇到除不尽的情况时,会报以上错误

解决方案:

System.out.println(b1.divide(b2,2,BigDecimal.ROUND_HALF_UP));

坑3:equals方法

public static void t2(){
    BigDecimal b1=new BigDecimal("0.0");
    BigDecimal b2=BigDecimal.ZERO;
    System.out.println(b1.equals(b2));
}

结果:

false

原因:

BigDecimal 的equals 方法不仅仅是比较值,还会比较scale的位数是否相等,而Bigdecimal.ZERO的scale是0,所以为 false

解决方案:

使用compareTo方法. System.out.println(b1.compareTo(b2)==0)

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分