做题时走捷径,用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的字符串