【Java】浮點數相等性比較
今天在讀《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
來源:簡書
相關文章
- Java如何正確比較浮點數Java
- 浮點數的比較
- js精確比較浮點數大小JS
- C++ - 比較兩個浮點數大小C++
- PostgreSQL 原始碼解讀(196)- 浮點數比較SQL原始碼
- 我去,臉皮厚啊,你竟然使用==比較浮點數?
- 比較兩個陣列是否相等陣列
- C# 實現一個基於值相等性比較的字典C#
- matlab比較兩個矩陣是否相等Matlab矩陣
- python如何比較兩個字串是否相等Python字串
- Java中浮點數的坑Java
- 一個比較float是否相等的工具類
- python3中怎麼比較字串是否相等Python字串
- 浮點數
- 浮點數之間的比較,基本運算這些究竟是怎麼實現的
- Java 比較器Java
- 數字比較
- Js 比較兩個物件的鍵名與鍵值是否相等JS物件
- java 兩個列表的元素是否相等且各自元素數量相等Java
- 浮點數的理解
- java--BEAN比較JavaBean
- java比較日期大小Java
- Java和JavaSciprt比較Java
- 浮點數小知識點
- Java 浮點數精確性探討(IEEE754 / double / float)與 BigDecimal 解決方案JavaDecimal
- 浮點數加減法
- 淺談浮點數(一)
- IEEE浮點數表示法
- 轉換成浮點數
- python處理浮點數Python
- 站點可靠性工程SRE與平臺工程比較
- JAVA中生成隨機數Random VS ThreadLocalRandom效能比較Java隨機randomthread
- Java的BigDecimal比較大小JavaDecimal
- 大數相乘(浮點數)實現
- Linux指令碼中帶有小數點的數值比較大小Linux指令碼
- 比較Java與Node.js的併發性和效能- maxantJavaNode.js
- 多執行緒中,區域性變數與全域性變數哪個比較安全?執行緒變數
- Python 解惑:整數比較Python