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
。。。