Java浮点类型精度丢失问题
2019-10-17 本文已影响0人
一岁一枯荣啊
一、问题
public class TsDom {
public static void main(String[] args) {
double dou1 = 0.1;
double dou2 = 0.2;
System.out.println(dou1 + dou2);
//结果为0.30000000000000004
}
}
二、分析我们把十进制的0.3转为二进制
小数类型转化为二进制方法: 小数乘以2得到b,取b的整数位,如果b为1.0结束计算得到结果。
-
0.3 x 2 = 0.6 ------取整数部分 0
-
0.6 x 2 = 1.2 ------取整数部分 1
-
0.2 x 2 = 0.4 ------取整数部分 0
-
0.4 x 2 = 0.8 ------取整数部分 0
-
0.8 x 2 = 1.6 ------取整数部分 1
-
0.6 x 2 = 1.2 ------取整数部分 1
-
0.2 x 2 = 0.4 ------取整数部分 0
-
0.4 x 2 = 0.8 ------取整数部分 0
-
0.8 x 2 = 1.6 ------取整数部分 1
……. 无限循环..........循环体1001
结果为 0.0110011001100110011001100………..
十进制转二进制,有些十进制数是无法使用一个有限的二进制数来表示。所以造成运算丢失精度
三、解决(BigDecimal)
public class TsDom {
public static void main(String[] args) {
double dou1 = 0.1;
double dou2 = 0.2;
System.out.println(dou1 + dou2);
//结果为0.30000000000000004
//BigDecimal
BigDecimal bigDecimal1 = new BigDecimal(Double.toString(dou1));
BigDecimal bigDecimal2 = new BigDecimal(Double.toString(dou2));
System.out.println(bigDecimal1.add(bigDecimal2).doubleValue());
//0.3
}
}