代码演示
public static void main(String[] args) {
double a = 0.1D;
BigDecimal g1 = new BigDecimal(0.1);
System.out.println("g1 = " + g1);
BigDecimal g2 = new BigDecimal(Double.toString(a));
System.out.println("g2 = " + g2);
BigDecimal g3 = BigDecimal.valueOf(a);
System.out.println("g3 = " + g3);
}
运行结果:
g1 = 0.1000000000000000055511151231257827021181583404541015625
g2 = 0.1
g3 = 0.1
由运行结果可以看出,通过 BigDecimal(dobule) 构造方法实际存储的值是一串非常长的数值,并没有存储原来小 a 指向的具体数值,在精密计算中很容易导致精度丢失
但是使用 BigDecimal(String) 或者是 BigDecimal#valueOf(double) 方法实际对 double 能表达的精度在底层进行截断。