.toFixed()为什么精度损失

探讨V8引擎中双精度浮点数的存储机制,包括64位双精度浮点数的组成,精度损失原因,及toFixed方法的实现原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值