使用BigDecimal丢失精度的问题
使用BigDecimal丢失精度的问题
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