使用BigDecimal来解决float、double计算时的精度丢失问题

首先看一个例子:

package BigDecimalDemo;

public class Demo {
    public static void main(String[] args) {
        double d1 = 0.05;
        double d2 = 0.02;
        System.out.println(d1 - d2);
    }
}

输出结果为:

0.030000000000000002

这是由于float、double类型在进行计算时存在精度丢失问题,那如何解决呢?

package BigDecimalDemo;

import java.math.BigDecimal;

public class Demo {
    public static void main(String[] args) {
        double d1 = 0.05;
        double d2 = 0.02;
        BigDecimal bigDecimal1 = new BigDecimal(String.valueOf(d1));
        BigDecimal bigDecimal2 = new BigDecimal(String.valueOf(d2));
        System.out.println(bigDecimal1.subtract(bigDecimal2).doubleValue());
    }
}

输出结果为:

0.03

但需要特别注意,一定要使用参数为string的构造函数,不然仍会有问题,如下:

package BigDecimalDemo;

import java.math.BigDecimal;

public class Demo {
    public static void main(String[] args) {
        double d1 = 0.05;
        double d2 = 0.02;
        BigDecimal bigDecimal1 = new BigDecimal(d1);
        BigDecimal bigDecimal2 = new BigDecimal(d2);
        System.out.println(bigDecimal1.subtract(bigDecimal2).doubleValue());
    }
}

输出结果为:

0.030000000000000002

 另外,在比较BigDecimal是否相等时,看以下例子:

package BigDecimalDemo;

import java.math.BigDecimal;

public class CompareDemo {
    public static void main(String[] args) {
        BigDecimal bigDecimal1 = new BigDecimal("0.1");
        BigDecimal bigDecimal2 = new BigDecimal("0.10");
        System.out.println(bigDecimal1.equals(bigDecimal2));
        System.out.println(bigDecimal1.compareTo(bigDecimal2));
    }
}

结果为:

false
0

0.1和0.10使用equals比较时是不相等的,而使用compareTo比较是相等的。

posted @ 2021-12-10 21:08  一首简单的歌  阅读(331)  评论(0编辑  收藏  举报