0.1 + 0.2 !== 0.3爲什麼?

1、JavaScript中數字的存儲機制:採用的是IEEE754 雙精度64位浮點數

雙精度(64位)浮點數的結構:(s) * (2 ^ e) * ( m )

s: sign 符號位: 1bit

e: exponent 指數位: 11bit

m: mantissa 尾數位: 52bit

排列規則爲:符號位S(1位,0爲正數,1爲負數) + 階碼E(8位)  + 尾數M(52位)

2、0.1和0.2都會先轉成二進制再相加,相加之後再轉成十進制

0.1轉成二進制爲
   0. 0 0011 0011 0011 ....循環
0.2轉成二進制爲
   0. 0011 0011 0011 ....循環

然後用IEEE754 雙精度64位浮點數
0.1=>  m = 1.1 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 010 
       e= -4

0.2=>  m = 1.1 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 010 
       e= -3

0.1 + 0.2 //(先變成相同的指數再相加)
          // 指數不一致時,一般是往右移,因爲即使右邊溢出了,損失的精度遠遠小於左移時的溢出

0.1=>  m = 0. 11 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 010 
       e= -3
        
0.2=>  m = 1.1 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 010 
       e= -3

0.1 + 0.2 =
       m = 10. 011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 1(52位)
       e= -3

       m = 1. 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 1(53位)
       e= -2
       // 最終取52位,保留成偶數
最後轉換成十進制爲:0.30000000000000004

。。。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章