精度陷阱

老生长谈的问题:

2.0f-1.1f = 0.9 ; 2.0-1.1 = 0.8999999999999999

原因的话后面有空深究然后再总结,随便搜搜发现,如下暂定的结论:java语言并不是使用小数点或者十进制来表示数字,相反,它是采用分数和指数来表示,而且是使用二进制的。

0.5 = 1/2
0.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,如果精度有差四舍五入。。

posted on 2012-02-16 17:39  山上明月  阅读(225)  评论(0编辑  收藏  举报