v8核心代碼中對於小數存儲位雙精度浮點,即64位保存的,但是這64位又分爲三部分。
1、由於52位尾數用於記錄數值,所以前端的精準位數應該是2^53-1即15位。當超過15位的時候就會出現精度損失。
2、小數的存儲模式:
例如:2.55
2.55的二進制位 10.1000110011001100...循環 寫成2的科學記數法位 1.0100011001100....*2^1
所以 符號位爲 0 ,指數是1,根據什麼IEEE...de 狗屁規定要在+1023得到指數 即 保存的指數爲1024 則11位指數位 1000000000.那麼剩下的1.0100011001100...這些數字就保存在尾數位。由於科學記數法都是1.xxx的形式,所以整數位的1就不用保存了。那麼52位位數爲0100011001100...循環
如下圖:
那麼2.55.toFixed(n)就是在尾數位上減去第n位以外的小數,然後判斷剩下的尾數是否大於2^-(n+1)。大於等於就進位,小於等於就不進位。
b例如:2.55.toFixed(1)
0 10000000000 0100011001100110011001100110011001100110011001100110
- 01000000000000000000000000000000000000000000000000
= 0000011001100110011001100110011001100110011001100110
然而 0000011001100110011001100110011001100110011001100110即 0.000011001100110011001100110011001100110011001100110 = 0.04999999999999982236431605997495353221893310546875 < 2^-2=0.05即 不會進位。實際上v8核心是通過尾數移位並通過某一個指定的標誌位是否爲1來判斷進位的。