【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
- Java經典例項:比較浮點數Java
- js精確比較浮點數大小JS
- C++ - 比較兩個浮點數大小C++
- oracle 比較日期相等Oracle
- PostgreSQL 原始碼解讀(196)- 浮點數比較SQL原始碼
- 比較兩個陣列是否相等陣列
- shell比較兩個字串是否相等字串
- lisp 裡的相等(相同)的比較Lisp
- Java浮點數計算Java
- C# 實現一個基於值相等性比較的字典C#
- Java中浮點數的坑Java
- python如何比較兩個字串是否相等Python字串
- 一個比較float是否相等的工具類
- matlab比較兩個矩陣是否相等Matlab矩陣
- 學習JAVA浮點數必看文章!Java
- 浮點數
- python3中怎麼比較字串是否相等Python字串
- PLSQL Language Referenc-PL/SQL集合和記錄-集合比較-比較巢狀表是否相等SQL巢狀
- 浮點數之間的比較,基本運算這些究竟是怎麼實現的
- Java 比較器Java
- JAVA字串比較Java字串
- Python解惑:整數比較 is ==的比較Python
- 浮點數的理解
- 自定義模型相等比較模型
- Js 比較兩個物件的鍵名與鍵值是否相等JS物件
- 【求教:如何解決 java 浮點數精度問題】Java
- 浮點數小知識點
- java 兩個列表的元素是否相等且各自元素數量相等Java
- java比較日期大小Java
- Java和JavaSciprt比較Java
- java--BEAN比較JavaBean
- [java之list比較]Java
- JAVA IO效能比較Java
- 淺談浮點數(一)
- 轉換成浮點數
- [譯]浮點數的危害
- JAVA 字元轉浮點型Java字元