做题时走捷径,用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的字符串
本文探讨了JavaScript中Number类型的限制及安全整数范围,并介绍了如何使用BigInt处理超出安全范围的大数,确保精度。

1710

被折叠的 条评论
为什么被折叠?



