[JavaScript] js字符串转数字长度限制|超过长度有误差

服务端使用长整型(Int64)的数字,在浏览器端使用JS的number类型接收时,当这个实际值超过 (2^53-1)时,JS变量的值和实际值就会出现不相等的问题。常见场景比如使用雪花算法生成Id。

在服务端,数字长整型有64位(bit),第一位为符号位,后边为数字位。

JS引擎中第一位为符号位,第二位到第十二位为指数位,数字位只剩最后52位(其中还有一位隐藏,实际53位),详情见下方链接
链接: link.

// An highlighted block
var numLen16 = '999999999666666'
numLen16.length // 16  长度16位 正整数
+numLen16 // '999999999666666' 没有误差
var numLen17 = '9999999999555557'
numLen17.length // 17  长度17位 正整数
+numLen16 // '9999999999555556' 从第17位开始出现误差//json 化时的问题var json = JSON.stringify({a:999999999955555777,b:true})json // "{"a":999999999955555800,"b":true}"  也会出现误差

知道Number的具体存储特征后,我们再来分析一下小数精度丢失的原因

小数进行算术运算时,实质上就是把十进制的浮点数转化为二进制,这样的结果是无穷的,JS最多有2的53次方有效数字,并不是精准的,所以再进行运算时会失准

那么JS可以存储最大的数字和最大安全数字是什么呢?可以使用Number的属性进行表示

JS存储最大值:Number.Max_VALUE()
JS最大安全值:Number.Max_SAFE_INTERGER(),即2的53次方
最后看一下处理大数字(超出范围)的方法及避免精度丢失的方法

避免精度丢失方法:toFixed()方法,先进行四舍五入取有效的小数位数,然后使用parseFloat()返回浮点数
处理大数字的方法:
①使用big-integer处理大数
②将数字变为字符串进行处理

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值