在 JavaScript 中,由于数字的精度限制,有时候会出现数字错位的问题,例如:
console.log(9007199254740991 + 1); // 9007199254740992 console.log(9007199254740991 + 2); // 9007199254740992
这是因为 JavaScript 中的数字是以双精度浮点数的形式存储的,只能精确表示 2 的 53 次方以内的整数,超过这个范围就会出现精度问题。
为了解决这个问题,ES10 引入了一种新的数据类型 BigInt,可以精确表示任意大的整数。
BigInt 数据类型
BigInt 是一种新的数据类型,可以用来表示任意大的整数。它可以通过在数字后面加上 n 或者调用 BigInt() 函数来创建。
const bigInt1 = 9007199254740991n; const bigInt2 = BigInt("9007199254740991"); console.log(bigInt1); // 9007199254740991n console.log(bigInt2); // 9007199254740991n
BigInt 的运算和普通的数字类似,但是需要使用 BigInt() 函数来进行转换。
const bigInt1 = 9007199254740991n; const bigInt2 = 2n; console.log(bigInt1 + bigInt2); // 9007199254740993n console.log(bigInt1 * bigInt2); // 18014398509481982n
BigInt 的使用场景
BigInt 的主要应用场景是处理超过 2 的 53 次方的整数,例如大型计算、加密算法等。
const bigInt1 = 1234567890123456789012345678901234567890n; const bigInt2 = 9876543210987654321098765432109876543210n; console.log(bigInt1 + bigInt2); // 11111111111111111111111111111111111111100n
BigInt 的注意事项
- BigInt 不能和普通的数字混合运算,必须先进行类型转换。
const bigInt1 = 9007199254740991n; const num1 = 1; console.log(bigInt1 + num1); // TypeError: Cannot mix BigInt and other types, use explicit conversions console.log(bigInt1 + BigInt(num1)); // 9007199254740992n
- BigInt 不能使用 Math 对象中的方法,需要使用专门的 BigInt 方法。
const bigInt1 = 1234567890123456789012345678901234567890n; console.log(Math.abs(bigInt1)); // TypeError: Cannot convert a BigInt value to a number console.log(bigInt1.toString()); // "1234567890123456789012345678901234567890"
示例代码
下面是一个使用 BigInt 解决数字错位问题的示例代码:
-- -------------------- ---- ------- -------- ------ -- - ----- ------- - ---------- ----- ------- - ---------- ------ -------- - -------------------- - ----------------------------------- ------ -- ------------------ ----------------------------------- ------ -- ------------------
总结
ES10 引入了 BigInt 数据类型,可以精确表示任意大的整数,解决了 JavaScript 中数字精度不足的问题。但是需要注意 BigInt 和普通的数字不能混合运算,需要进行类型转换。在处理超过 2 的 53 次方的整数时,可以使用 BigInt 来保证精度。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/65e196d31886fbafa4e8e957