Java細節 浮點數精度丟失問題的原因

2021-09-11 00:04:11 字數 1002 閱讀 6890

我們知道整數型別沒有精度丟失的問題,但是浮點數有精度丟失的問題,下面我們來**一下其精度丟失的原因所在。

浮點數,分單精度(float)和雙精度(double):

float ,介於 -3.402823e38 和 +3.402823e38 之間的32位數字;

double ,介於 -1.79769313486232e308 和 +1.79769313486232e308 之間的64位數字;

我們知道,計算機只識別 0 和 1,所以數值都是以二進位制的方式儲存在記憶體中的。

所以要知道數值在記憶體中是如何儲存的,需先將數值轉為二進位制

根據 ieee 754 標準,任意乙個二進位制浮點數 v 均可表示為:v = (-1 ^ s) * m * (2 ^ e)。

其中 s ∈ ;m ∈ [1, 2);e 表示偏移指數。

具體浮點數的 ieee 754表示方法在我之前的部落格有所講解,不清楚的可以檢視,這裡就不解釋了。

我們先**一下int 和 float同樣都是用32位表示,但是為什麼float範圍就比int大很多呢?

int取值範圍:-2147483648~2147483647,遠遠不足float: -3.402823e38 ~+3.402823e38

我們知道int數值是連續且等分的,而float數值是跳躍的,並且間隔不一定相等。都是用32位表示,也就是說int和float可儲存數值的最大數量是相等的,為2的32次方。

文字理解有點抽象,下面我們上圖來看

作的圖不夠嚴謹,但是大概意思我們可以看到,在負數值範圍內,float可以表示更加精確的數(圖中較為密集的部分),但是在正數範圍中,float表示的就不如int精確了,並且float數值不是等分表示的,這就造成了float的精度丟失。

這樣應該就能理解浮點數精度丟失的原因了,其實最根本原因還是計算機只能採取二進位制儲存資料

浮點數精度丟失問題

c 中的浮點數,分單精度 float 和雙精度 double float 是 system.single 的別名,介於 3.402823e38 和 3.402823e38 之間的32位數字,符合二進位制浮點演算法的 iec 60559 1989 ieee 754 標準 double 是 system...

JS之浮點數精度丟失問題

js中,在進行浮點數計算的時候,會出現精度丟失的問題,如下 alert 0.1 0.2 alert 0.3 0.2 alert 0.1 0.2 alert 0.3 0.2 正常情況,得出的結果應該是0.3,0.1,0.02,1.5,但是實際得出的結果卻不是這樣,如下 可以看到,得出的結果並不是我們預...

浮點數的運算精度丟失

開啟python編譯器,輸入0.1 0.2,期待的結果是0.3,但是輸出為 0.30000000000000004 有點小尷尬,這是為什麼呢?其實這設計到了計算機的浮點數儲存是以二進位制進行儲存的。說二進位制不太形象,換成我們最長使用的十進位制和分數 1 5,使用小數表示為0.2,但是1 3,使用小...