.toFixed()为什么精度损失

时间:2024-04-07 07:03:48

v8核心代码中对于小数存储位双精度浮点,即64位保存的,但是这64位又分为三部分。

 

.toFixed()为什么精度损失

.toFixed()为什么精度损失

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

如下图:.toFixed()为什么精度损失.toFixed()为什么精度损失

那么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来判断进位的。