js浮點數丟失問題

田小菜發表於2019-05-03

why 0.1 + 0.2 = 0.30000000000000004 ?

這是js浮點精度丟失問題

  • 在js中,數字用Number型別表示。而其中一個數字是由64位組成。如下圖說明:

js浮點數丟失問題

  • 圖片說明:

  • 第0位:符號位,0表示正數,1表示負數(s)

  • 第1位到第11位:儲存指數部分(e)

  • 第12位到第63位:儲存小數部分(即有效數字)f

  1. 由於計算機無法對十進位制直接運算,需要根據 IEEE 754 規範轉成二進位制。然後再進行對階運算,這一轉換過程中,精度會丟失一次。
0.1.toString(2) //"0.0001100110011001100110011001100110011001100110011001101"
0.2.toString(2) //"0.001100110011001100110011001100110011001100110011001101"

// 但是由於IEEE 754尾數位數限制,需要將後面多餘的位截掉,這樣在進位制之間的轉換中精度已經損失。
複製程式碼
  1. 對階運算
  • 由於指數位數不相同,運算時需要對階運算 這部分也可能產生精度損失。
  • 按照上面兩步運算(包括兩步的精度損失),最後的結果是:0.0100110011001100110011001100110011001100110011001100
  • 再轉換成十進位制得 0.30000000000000004。

參考文章

相關文章