展开全部
主要是因为java中的【简单类型】636f707962616964757a686964616f31333332643230并不适用于对【浮点】的【 精确计算】。,其它语言也存在同样的问题。
计算机存储数值,是二进制的。 在处理的时候,也是先把【浮点数】(float , double)转成整数再转成二进制,然后进行操作,如果有取余,会有不同的取余方式。再加上运算完成后,再多二进制转成上层的浮点,又会有一些取舍。就造成了呈现出来时的简单明显的错误 。
你可以试试下面的代码:System.out.println(0.05 + 0.01);// 0.060000000000000005
System.out.println(1.0 - 0.42); // 0.5800000000000001
System.out.println(4.015 * 100);// 401.49999999999994
System.out.println(123.3 / 100); // 1.2329999999999999
在需要精确计算时, Math.round () 或则 DecimalFormat("0.00").format(4.025)) 都是不可取的。
要使用BigDecimal 或则 BCD码。
使用 BigDecimal 的时候,要使用 new BigDecimal (String ss) 这个构造函数。
public BigDecimal(double val) 这个构造函数也是不推荐的。 你可以参考这个函数的的注释。
BigDecimal b2 = new BigDecimal("0.3");
BigDecimal b1 = new BigDecimal("1.8");
System.out.println(b1.divide(b2));