why 0.1 + 0.2 = 0.30000000000000004 ?
這是js浮點精度丟失問題
- 在js中,數字用Number型別表示。而其中一個數字是由64位組成。如下圖說明:
-
圖片說明:
-
第0位:符號位,0表示正數,1表示負數(s)
-
第1位到第11位:儲存指數部分(e)
-
第12位到第63位:儲存小數部分(即有效數字)f
- 由於計算機無法對十進位制直接運算,需要根據 IEEE 754 規範轉成二進位制。然後再進行對階運算,這一轉換過程中,精度會丟失一次。
0.1.toString(2) //"0.0001100110011001100110011001100110011001100110011001101"
0.2.toString(2) //"0.001100110011001100110011001100110011001100110011001101"
// 但是由於IEEE 754尾數位數限制,需要將後面多餘的位截掉,這樣在進位制之間的轉換中精度已經損失。
複製程式碼
- 對階運算
- 由於指數位數不相同,運算時需要對階運算 這部分也可能產生精度損失。
- 按照上面兩步運算(包括兩步的精度損失),最後的結果是:0.0100110011001100110011001100110011001100110011001100
- 再轉換成十進位制得 0.30000000000000004。