為什麼浮點型運算結果會有誤差?

2021-10-13 19:32:09 字數 1169 閱讀 6296

如var a=0.65;

var b=0.6;

console.log(a-b)==0.05???錯   a-b=0.050000000000000044
為什麼?

其根本原因在於計算機所使用的01**無法準確地表示某些帶小數的十進位制資料。

下面我們來分析下:

我們知道將乙個十進位制數值轉換為二進位制數值,需要通過下面的計算方法:

1. 整數部分:連續用該整數除以2,取餘數,然後商再除以2,直到商等於0為止。然後把得到的各個餘數按相反的順序排列。簡稱"除2取餘法"。

2. 小數部分:十進位制小數轉換為二進位制小數,採用"乘2取整,順序排列"法。用2乘以十進位制小數,將得到的整數部分取出,再用2乘餘下的小數部分,然後再將積的整數部分取出,如此進行,直到積中的小數部分為0或者達到所要求的精度為止。然後把取出的整數部分按順序排列起來,即先取出的整數部分作為二進位制小數的高位,後取出的整數部分作為低位有效位。簡稱"乘2取整法"。

3. 含有小數的十進位制數轉換成二進位制,整數、小數部分分別進行轉換,然後相加。

例如:將十進位制數值25.75轉換為二進位制數值,步驟如下:

25(整數部分)

25/2=12…1

12/2=6…0

6/2=3…0

3/2=1…1

1/2=0…1

(25) 10=(11001) 2

0.75(小數部分)

0.75*2=1.5…1

0.5*2=1…1

(0.75) 10=(0.11) 2

(25.75) 10=(11001) 2+(0.11) 2=(11001.11) 2

按照上述方法,我們將0.65及0.6轉換為二進位制**:

(0.65)10 = (0.101001100110011001100110011001100110011…)2

(0.6) 10 = (0.10011001100110011001100110011001100110011…)2

後面的省略號表示已經算不完了,後面在無限重複 0011 這段二進位制數值。

因為浮點型只能儲存32位,所以會進行擷取,擷取後的二進位制**已無法準確表示0.65和0.6,所以無法得到正確的結果

解決方法:因為二進位制數可以準確表示整數,所以可以先將小數乘10或100等變成整數,然後做運算,最後再通過除以10或100來獲得結果。

為什麼浮點型運算結果會有誤差?

如var a 0.65 var b 0.6 console.log a b 0.05?錯 a b 0.050000000000000044 為什麼?其根本原因在於計算機所使用的01 無法準確地表示某些帶小數的十進位制資料。下面我們來分析下 我們知道將乙個十進位制數值轉換為二進位制數值,需要通過下面的...

為什麼浮點數一定是有誤差的

前提 學習過訊號處理,了解到在訊號處理中,我們能夠處理的都是數碼訊號,絕對不是模擬訊號。數碼訊號是離散訊號,模擬訊號是連續訊號。在這一思想基礎下,思考了為什麼會存在浮點數誤差問題。為什麼不討論int整型會不會有誤差而浮點數一定要考慮誤差問題呢?就是因為,本質上我們面對int整型時候,想要處理的資料就...

PHP浮點運算結果出現誤差原因分析及解決方案

如下 float a 0.65f float b 0.6f float c a b 此時c為多少?0.05?錯誤!此時c為0.0499999523!為什麼?其根本原因是計算機所使用二進位制01 無法準確表示某些帶小數字的十進位制資料。下面我們來分析下 我們知道將乙個十進位制數值轉換為二進位制數值,需...