2012年12月26日 星期三

浮點數比較

應該很多人都知道,電腦用二進位的方式在表達浮點數時,時常會有誤差值的存在
例如表達數字 100,如果用浮點數表達時,實際上電腦表達的數字,有可能是 100.0000000001 或者 99.999999999 之類的數字。

目前我知道的處理方法有兩種,一種是參考 [1] 的作法,在判斷時加入容許誤差的條件
例如:
if (fabs(result - expectedResult) < 0.00001)

另一種就是用像是 BidDecimal 之類的物件,可以做精確的數字處理。
不過使用 BigDecimal 時有些要注意的小事項,可以參考 [2]
大概有兩點:
1、初始化 BigDecimal 時盡量使用 String 而不要使用 float、double。
2、大多數時候,BigDecimal 的比較用 compareTo() 會比用 equals() 準確一點。
第一點原因很簡單,因為 float、double 本身就已經產生誤差了,再指給 BigDecimal 也不會讓誤差縮回去。
第二點則應該參考 [3],[3] 的回應中有提到,官方文件上有說明使用 equals() 時是連 scale 都一樣的狀況。

參考資料:
1、Comparing floating point numbers
2、關於BigDecimal的比較
3、Why BigDecimal(“5.50”) not equals to BigDecimal(“5.5”) and how to work around this issue?

沒有留言: