这个和计算机保存浮点数的机制有很大关系。我们知道计算机是二进制的,而且计算机在表示一个数字时,宽度是有限的,无限循环的小数存储在计算机时,只能被截断,所以就会导致小数精度发生损失的情况。这也就是解释了为什么浮点数没有办法用二进制精确表示。
浮点数之间的等值判断,基本数据类型不能用 == 来比较,包装数据类型不能用 equals 来判断。
正确示例
1.指定一个误差范围,两个浮点数的差值在此范围之内,则认为是相等的。
floata=1.0F-0.9F;
floatb=0.9F-0.8F;
floatdiff=1e-6F;
if (Math.abs(a-b) <diff ) {
Symstem.out.println("true");
}
2.使用BigDecimal来定义值,在进行浮点数操作
BigDecimala=newBigDecimal("1.0");
BigDecimalb=newBigDecimal("0.9");
BigDecimalc=newBigDecimal("0.8");
BigDecimalx=a.subtract(b);
BigDecimaly=b.subtract(c);
if (x.compareTo(y) ==0) {
System.out.println("true");
}
// BigDecimal等值比较用compareTo方法而不用equals,因为equals会比较精度(1.0与1.00比较结果为false),而compareTo忽略精度