精度陷阱
老生长谈的问题:
2.0f-1.1f = 0.9 ; 2.0-1.1 = 0.8999999999999999
原因的话后面有空深究然后再总结,随便搜搜发现,如下暂定的结论:java语言并不是使用小数点或者十进制来表示数字,相反,它是采用分数和指数来表示,而且是使用二进制的。
0.5 = 1/20.75 = 1/2 + 1/(2^2)0.85 = 1/2 + 1/(2^2) + 1/(2^3)0.1 = 1/(2^4) + 1/(2^5) + 1/(2^8) + ...
注意,0.1只能是无限循环下去的,这就意味着0.1在java里面不能够准确的用浮点数来表示,也就造成了浮点数运算上面的误差。
if (0.1 + 0.1 + 0.1 != 0.3)
System.out.println("0.1 + 0.1 + 0.1 is not equal with 0.3");
else
System.out.println("0.1 + 0.1 + 0.1 is equal to 0.3");
。。。。(后面有时间再整理吧。。)
所以java里面使用BigDecimal(java.lang.String)
另外,再判断浮点数差值的时候,可以如下做:
if (Math.abs(d - 0.9) < 0.000001) {
System.out.println("相同");
}
double,float计算的时候都变为double计算然后转换为float,如果精度有差四舍五入。。