为什么需要BigDecimalc double 计算会有精度丢失的问题
参考文章
对于精度问题我们可以看下实际的例子
public static void main(String[] args) {
//正常 3.3
System.out.println("加法结果:"+(1.1+2.2));
//正常 -7.9
System.out.println("减法结果:"+(2.2-10.1));
//正常 2.42
System.out.println("乘法结果:"+(1.1*2.2));
//正常 0.44
System.out.println("除法结果:"+(4.4/10));
}
实际控制台输出
为什么会出现这种情况?
在于我们的计算机是二机制的,浮点数是没有办法用二机制精确表示。
我们的cpu表示浮点数由两部分组成:指数和尾数,这样的表达方式都会造成一定的精度丢失。有些浮点数运算会造成一定的误差,如:2.4的二进制表示并非就是精确的2.4。反而最为接近的二进制表示是 2.3999999999999999
BigDecimal构造函数
System.out.println("189.32 - 189.31");
//double运算
Double heightExm = 189.32 - 189.31;
BigDecimal bigDecimal = BigDecimal.valueOf(heightExm);
System.out.println("精度丢失:"+bigDecimal.intValue());
//BigDecimal运算,
BigDecimal bigDecimal1 = BigDecimal.valueOf(189.32);
BigDecimal bigDecimal2 = BigDecimal.valueOf(189.31);
BigDecimal subtract = bigDecimal1.subtract(bigDecimal2);
BigDecimal bigDecimal3 = subtract.setScale(0, BigDecimal.ROUND_UP);
System.out.println("精度没有丢失:"+bigDecimal3);