使用BigDecimal丢失精度的问题

使用BigDecimal丢失精度的问题

通常使用double时会需要运算,但是往往出现精度丢失的问题:

double d1 = 0.01;
double d2 = 0.1;
System.out.println(d2 - d1);
//输出
0.09000000000000001

常识告诉我们使用BigDecimal能解决精度丢失的问题:

BigDecimal b1 = new BigDecimal(0.01);
BigDecimal b2 = new BigDecimal(0.1);
System.out.println(b2.subtract(b1));
//输出
0.09000000000000000534294830600856585078872740268707275390625

还是丢失了精度,为什么呢?

在BigDecimal传double参数的构造方法中,有这样一句话“The results of this constructor can be somewhat unpredictable.”意思是这个构造函数的结果在某种程度上是不可预测的。所以初始化BigDecimal时传入double的方式不可取。

如何不丢失精度?

1,使用Double.toString方法转字符串

BigDecimal b1 = new BigDecimal(Double.toString(0.01));
BigDecimal b2 = new BigDecimal(Double.toString(0.1));
System.out.println(b2.subtract(b1));
//输出
0.09

2、直接传入一个字符串

BigDecimal b1 = new BigDecimal("0.01");
BigDecimal b2 = new BigDecimal("0.1");
System.out.println(b2.subtract(b1));
//输出
0.09

3、使用BigDecimal.valueOf方法

BigDecimal b1 = BigDecimal.valueOf(0.01);
BigDecimal b2 = BigDecimal.valueOf(0.1);
System.out.println(b2.subtract(b1));
//输出
0.09

 

原文地址:https://www.cnblogs.com/zhangcaihua/p/14650568.html