js浮點數丟失問題

why 0.1 + 0.2 = 0.30000000000000004 ?

這是js浮點精度丟失問題

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

  • 圖片說明:post

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

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

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

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

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

參考文章blog

相關文章
相關標籤/搜索