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