Java如何处理浮点数运算的精度问题

2025-10-24 09:43:45

1、我们先看看Java中直接使用double进行浮点数运算时,出现的精度问题,测试代码如下:

private void testAccuracyProblem() {

 

        

 

        double d1 = 0.01;

 

        double d2 = 0.05;

 

        double d3 = 0.06;

 

        

 

        if(Double.compare((d1+d2), d3) == 0) {

 

            System.out.println("两个数字相等!");

 

        }else {

 

            System.out.println("两个数字不相等!");

 

        }

 

    }

上述代码运行后,输出了 "两个数字不相等!", 这就是Java中浮点运算的精度问题。

Java如何处理浮点数运算的精度问题

2、为了处理浮点数运算的精度问题,Java推出了 BigDecimal 类,我们先将上述类中的浮点数表示换成 BigDecimal 类,再看看效果:

private void testAccuracyProblem() {

 

        

 

        BigDecimal b1 = new BigDecimal(0.01);

 

        BigDecimal b2 = new BigDecimal(0.05);

 

        BigDecimal b3 = new BigDecimal(0.06);

 

        

 

        if(b1.add(b2).compareTo(b3) == 0) {

 

            System.out.println("两个数字相等!");

 

        }else {

 

            System.out.println("两个数字不相等!");

 

        }

 

    }

上述代码运行后,输出的竟然还是 "两个数字不相等!"

Java如何处理浮点数运算的精度问题

3、为啥使用 BigDecimal 类还出现精度问题呢? 问题出在这个构造函数上,我们使用一个double浮点数作为参数的构造函数来创建 BigDecimal 对象,这个构造函数创建的对象精度本身就有问题,相关API文档对这个问题也有描述(详见图示)。

Java如何处理浮点数运算的精度问题

4、那该怎么办呢? BigDecimal建议我们使用字符串参数的构造函数,代码如下:

private void testAccuracyProblem() {

 

        

 

        BigDecimal b1 = new BigDecimal(String.valueOf(0.01));

 

        BigDecimal b2 = new BigDecimal(String.valueOf(0.05));

 

        BigDecimal b3 = new BigDecimal(String.valueOf(0.06));

 

        

 

        if(b1.add(b2).compareTo(b3) == 0) {

 

            System.out.println("两个数字相等!");

 

        }else {

 

            System.out.println("两个数字不相等!");

 

        }

 

    }

Java如何处理浮点数运算的精度问题

5、由此,我们通过BigDecimal构建一个摆脱精度困扰的浮点数运算工具类,对应浮点数的四则运算,相关代码请参考图示。

Java如何处理浮点数运算的精度问题

Java如何处理浮点数运算的精度问题

Java如何处理浮点数运算的精度问题

Java如何处理浮点数运算的精度问题

声明:本网站引用、摘录或转载内容仅供网站访问者交流或参考,不代表本站立场,如存在版权或非法内容,请联系站长删除,联系邮箱:site.kefu@qq.com。
猜你喜欢