JavaScript 中的 BigInt:当普通数字不够“大“时的救星
前言
大家好!今天我们要聊一聊 JavaScript 中那个"大"到不行的数据类型 —— BigInt。如果你曾经因为 JavaScript 的数字精度问题而抓狂,或者好奇为什么 9007199254740992 === 9007199254740993
会返回 true
,那么这篇文章就是为你准备的!
为什么我们需要 BigInt?
JavaScript 中的 Number
类型使用 IEEE 754 双精度浮点数表示,这意味着它能安全表示的最大整数是 2^53 - 1(即 9007199254740991
)。超过这个数字,事情就开始变得…奇怪。
console.log(9007199254740991) // 正常
console.log(9007199254740992) // 看起来也正常
console.log(9007199254740993) // 等等,这不科学!
// 输出: 9007199254740992console.log(9007199254740992 === 9007199254740993)
// 输出: true 😱
看到没?JavaScript 在背后偷偷把你的大数字四舍五入了!这就是所谓的"精度丢失"问题。
BigInt 来拯救世界!
ES2020 引入了 BigInt 类型,专门用来表示任意精度的整数。有了它,你再也不用担心数字太大而"失真"了。
创建 BigInt
有两种方式创建 BigInt:
-
在数字后面加个
n
const bigNumber = 9007199254740993n; console.log(bigNumber); // 9007199254740993n
-
使用
BigInt()
函数const sameBigNumber = BigInt("9007199254740993"); console.log(sameBigNumber); // 9007199254740993n
注意:
- BigInt是一个函数,它不能通过
new BigInt
来创建- 通过
BigInt("123456789123456789")
这种方式创建,里面的传入的数据要是Boolean类型(也就是要加双引号,或者本身就是一个布尔类型),不然你传进去的数据已经精度丢失了
BigInt 的基本运算
BigInt 可以像普通数字一样进行运算,只是要注意几点:
const a = 123456789012345678901234567890n;
const b = 987654321098765432109876543210n;// 加法
console.log(a + b); // 1111111110111111111011111111100n// 减法
console.log(b - a); // 864197532086419753208641975320n// 乘法
console.log(a * b); // 121932631137021795226185032733622923332237463801111263526900n// 除法 (会向下取整)
console.log(b / a); // 8n
注意事项:BigInt 的"怪癖"
-
不能和 Number 直接混用:
console.log(1n + 2); // TypeError: Cannot mix BigInt and other types
你必须先转换类型:
console.log(1n + BigInt(2)); // 3n
-
没有小数部分:
BigInt 就是"大整数",所以:console.log(5n / 2n); // 2n,不是 2.5
-
比较运算符可以混用:
console.log(1n < 2); // true console.log(2n === 2); // false (类型不同) console.log(2n == 2); // true (值相同)
-
不能使用 Math 对象的方法:
console.log(Math.sqrt(16n)); // TypeError
实际应用场景
- 处理大整数 ID:
当你的数据库 ID 超过了 JavaScript 的安全整数范围时,BigInt 就派上用场了。 - 加密算法:
许多加密算法需要处理非常大的数字。 - 高精度计算:
金融计算、科学计算等需要精确整数运算的场景。
性能考虑
BigInt 的运算比普通 Number 要慢,所以除非真的需要,否则不要滥用。就像你不会用卡车去买菜一样(除非你要买的菜真的很多)。
有趣的 BigInt 技巧
使用 BigInt 计算斐波那契数列
function fibonacci(n) {let a = 0n, b = 1n;for (let i = 0n; i < n; i++) {[a, b] = [b, a + b];}return a;
}console.log(fibonacci(100n));
// 输出: 354224848179261915075n
使用 BigInt 进行位运算
const x = 0b1100110011001100110011001100110011001100110011001100110011001100n;
console.log(x >> 32n); // 右移32位
总结
BigInt 是 JavaScript 中处理大整数的终极解决方案。它就像数字类型的"加长版豪华轿车"——当你需要额外的空间时,它就在那里等着你。记住:
- 大数字后面加
n
或使用BigInt()
函数 - 不能和 Number 直接混用
- 没有小数部分
- 比普通 Number 运算慢
现在,去征服那些庞大的数字吧!记住:能力越大,责任越大(特别是当你的数字真的很大的时候)!
希望这篇略带幽默的技术博客能满足你的需求!BigInt 虽然看起来简单,但在实际应用中还是有很多需要注意的细节。如果你有任何问题或需要进一步的解释,随时告诉我!