首先在最开始之前,让我们来看一段代码。
System.out.println(0.09+0.01);
System.out.println(1.0-0.32);
System.out.println(1.015*100);
System.out.println(1.301/100);
你觉得答案是什么呢?0.10 , 0.68 , 101.5 , 0.01301吗?
不是的
答案是:
0.09999999999999999
0.6799999999999999
101.49999999999999
0.013009999999999999
对于这个结果你会不会很惊讶?
其实是因为浮点数是由符号位、指数、尾数组合而成,而其中指数是由移码表示,尾数是由补码表示。尾数是有长度限制的,而有些小数换算成二进制时,超过了这个长度,因此只能通过四舍五入得到一个近似值。
所以浮点运算很少是精确的,只要是超过精度能表示的范围就会产生误差。往往产生误差不是因为数的大小,而是因为数的精度。因此,产生的结果接近但不等于你所想要的结果。
因此我们利用BigDecimal来解决这个问题
BigDecimal方达如下:
public BigDecimal add(BigDecimal augend):加
public BigDecimal subtract(BigDecimal subtrahend):减
public BigDecimal multiply(BigDecimal multiplicand):乘
public BigDecimal divide(BigDecimal divisor):除
public BigDecimal divide(BigDecimal divisor,int scale,int roundingMode):商,几位小数。如何舍取
采用BigDecimal进行上面的运算
System.out.println(new BigDecimal("0.09").add(new BigDecimal("0.01")));//这里一定要是字符串才算是调用BigDemical构造方法
System.out.println(new BigDecimal("1.0").subtract(new BigDecimal("0.32")));//如果是float与double类型,得到的依旧是不精确的数值
System.out.println(new BigDecimal("1.015").multiply(new BigDecimal("100")));
System.out.println(new BigDecimal("1.301").divide(new BigDecimal("100")));
System.out.println(new BigDecimal("1.301").divide(new BigDecimal("100"),3,BigDecimal.ROUND_HALF_UP));//ROUND_HALF_UP是四舍五入
发现结果正常
0.10
0.68
101.500
0.01301
0.013