问题
对两个double类型的值进行运算有时会发现结果精度丢失的问题。例如:
System.out.println(10.2-10.1);
System.out.println(19.98+20);
System.out.println(0.58*100);
对应的输出结果为
0.09999999999999964
39.980000000000004
57.99999999999999
分析
Java中float和double不能够进行运算,因为大多数情况下运算是正常的,但是偶尔也会出现如的问题。这个问题其实是因为计算机本身是二进制的,而浮点数实际上只是个近似值,所以从二进制转化为十进制浮点数时,精度容易丢失,导致精度下降。
解决
要保证精度就要使用BigDecimal类,而且不能直接使用BigDecimal(double val) 方法,而是要将double转string再转BigDecimal。
也就是用BigDecimal(String val) 方法。例子如下:
public static Double add(Double value1, Double value2) {
BigDecimal b1 = new BigDecimal(Double.toString(value1));
BigDecimal b2 = new BigDecimal(Double.toString(value2));
return b1.add(b2).doubleValue();
}