【Java】浮點數相等性比較

cainiaoxiaosu發表於2020-10-02

今天在讀《Java開發手冊》時,看到浮點數的等值判斷問題「浮點數的基本資料型別不能用 == 比較,包裝資料型別不能用 equals 比較」。以前開發時也遇到過浮點數的坑,所以就想一探究竟。

1. 浮點數表示

在計算機系統理論中,浮點數採用 IEEE 754 標準表示,編碼方式是符號+階碼+尾數,如圖:

浮點數表示

比如 float 型別佔用 32 位,單精度浮點表示法:

  • 符號位(sign)佔用 1 位,用來表示正負數,0 表示正數,1 表示負數
  • 指數位(exponent)佔用 8 位,用來表示指數,實際要加上偏移量
  • 小數位(fraction)佔用 23 位,用來表示小數,不足位數補 0

從這裡可以看出,指數位決定了大小範圍,小數位決定了計算精度。當十進位制數值轉換為二進位制科學表示式後,得到的尾數位數是有可能很長甚至是無限長。所以當使用浮點格式來儲存數字的時候,實際儲存的尾數是被擷取或執行舍入後的近似值。這就解釋了浮點數計算不準確的問題,因為近似值和原值是有差異的。

更詳細的介紹可以查閱 java浮點型別float和double的主要區別,它們的小數精度範圍大小是多少? - Boss呱呱的回答 - 知乎

2. 比較浮點數的方式

讓我們來驗證一下比較浮點數的幾種方式。

1. == 操作符

比較兩個浮點數,一個從零開始加 11 次 0.1,另一個用 0.1 乘以 11 計算。然後用 == 比較大小。

參考文章

作者:落英墜露
連結:https://www.jianshu.com/p/4679618fd28c
來源:簡書

相關文章