0.1+0.2不等於0.3?是不是有點顛覆你的認知,但是,在js中,是真實存在的!
console.log(0.1+0.2); // 0.30000000000000004
其實這都是因為浮點數運算的精度問題。
簡單來說,因為計算機只認識二進制,在進行運算時,需要將其他進制的數值轉換成二進制,然后再進行計算。
由於浮點數用二進制表達時是無窮的:
// 將0.1轉換成二進制 console.log(0.1.toString(2)); // 0.0001100110011001100110011001100110011001100110011001101 // 將0.2轉換成二進制
console.log(0.2.toString(2)); // 0.001100110011001100110011001100110011001100110011001101
IEEE 754 標准的 64 位雙精度浮點數的小數部分最多支持53位二進制位,所以兩者相加后,因浮點數小數位的限制而截斷的二進制數字,再轉換為十進制,就成了 0.30000000000000004,
所以在進行算術計算時會產生誤差。
64位比特又可分為三個部分:
- 符號位S:第 1 位是正負數符號位(sign),0代表正數,1代表負數
- 指數位E:中間的 11 位存儲指數(exponent),用來表示次方數
- 尾數位M:最后的 52 位是尾數(mantissa),超出的部分自動進一舍零