.toFixed()爲什麼精度損失

v8核心代碼中對於小數存儲位雙精度浮點,即64位保存的,但是這64位又分爲三部分。

 

wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

 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...循環

如下圖:wAAACH5BAEKAAAALAAAAAABAAEAAAICRAEAOw==

那麼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來判斷進位的。

 

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