问题描述
public class DoubleTest {
public static void main(String[] args) {
double d1 = 148163.1;
double d2 = 82692.09;
System.out.println(d1 - d2);
}
}
运行结果:
从上图我们可以看出,结果本应该是65471.01,但是却出现精度不准确的问题.
原因
- double类型在进行加减的时候,会将数值转换成二进制的数值,但是在转换成二进制代码表示的时候,储存小数部分的位数会有不够的现象,即无限循环小数.(double转换为二进制数进行计算会丢失位数导致精度不准确);
解决方案
通过使用BigDecimal类来解决该问题;
public class DoubleTest {
public static void main(String[] args) {
BigDecimal d1 = new BigDecimal("148163.1");
BigDecimal d2 = new BigDecimal("82692.09");
System.out.println(d1.subtract(d2));
}
}
从上图,我们可以看出使用了BigDecimal类之后,这个精度缺失的现象就没有了.
注意: 这里我们在使用构造函数的时候传递的是字符串,而不是之间传入double类型的数;
其他运算符类比学习~