js转换为数字超16位精度丢失及解决

做题时走捷径,用Number和parseInt转换字符串,碰巧遇到这个问题:

    console.log(Number('6145390195186705111'));

输出:6145390195186705000

16位之后的数字不能转换。

查资料,原因:在js中number类型有个最大值(安全值)。为9007199254740992,是2的53次方。如果超过这个值,那么js会出现不精确的问题。

描述:MAX_SAFE_INTEGER 是一个值为 9007199254740991的常量。因为Javascript的数字存储使用了IEEE 754中规定的双精度浮点数数据类型,而这一数据类型能够安全存储 -(2^53 - 1) 到 2^53 - 1 之间的数值(包含边界值)。

解决方法:Bigint。

Bigint是一种内置对象(如Array、Date等),它提供了一种方法来表示大于 2^53 - 1 的整数。这原本是 Javascript中可以用 Number 表示的最大数字。Bigint可以表示任意大的整数。可以用在一个整数字面量后面加 n 的方式定义一个 BigInt ,如:10n,或者调用函数 BigInt()(但不包含 new 运算符)并传递一个整数值或字符串值:

const alsoHuge = BigInt(9007199254740991);
// ↪ 9007199254740991n

typeof 1n === 'bigint'; // true

于是我们刚才的问题就可以得到解决了:

​
const num= BigInt("6145390195186705111");
// ↪ 6145390195186705111n

这之后可以非常方便的用String(num)或者toString(num),转换为去掉n的字符串

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值