JavaScript - BigInt:处理真正的大数
你好,有抱负的程序员们!今天,我们将踏上一段激动人心的旅程,探索JavaScript中的真正、真正的大数。系好安全带,因为我们即将探索BigInt的迷人领域!
什么是BigInt?
想象你在夜晚的天空中数星星。你数啊数,但突然你的计算器显示“无限大”。对吧,这很令人沮丧?这就是BigInt大显身手的时候了!
BigInt是JavaScript中的一种特殊数字类型,可以表示任意长度的整数。与常规数字不同,BigInt没有局限性,它可以处理你的想象力(或者你的计算机内存)允许的任何大小的数字。
为什么我们需要BigInt?
在JavaScript中,常规数字存储在64位中,这意味着它们有一个最大安全整数值9,007,199,254,740,991。这是一个很大的数字,但在计算世界中,有时我们需要更大!
让我们看看当我们尝试超过这个限制时会发生什么:
console.log(9007199254740991n + 1n); // 9007199254740992n
console.log(9007199254740991n + 2n); // 9007199254740992n (哦!结果相同)
如你所见,JavaScript无法准确表示这个限制之外的数字。这正是BigInt的亮点!
声明和初始化
创建BigInt就像馅饼一样简单。你有两个选择:
- 在整数末尾附加'n'
- 使用BigInt()函数
让我们试试两种方法:
const bigNumber1 = 1234567890123456789012345678901234567890n;
const bigNumber2 = BigInt("9007199254740991");
console.log(bigNumber1); // 1234567890123456789012345678901234567890n
console.log(bigNumber2); // 9007199254740991n
注意到末尾的'n'了吗?这就是JavaScript知道它是BigInt的方式!
基本操作
现在我们有了大数,让我们做一些数学运算!
const a = 1234567890n;
const b = 9876543210n;
console.log(a + b); // 11111111100n
console.log(a - b); // -8641975320n
console.log(a * b); // 12193263111263526900n
console.log(a / b); // 0n (整数除法)
console.log(a % b); // 1234567890n
记住,BigInt总是整数。在除法时,结果向下取整到最近的整数。
比较
比较BigInt就像比较常规数字一样:
console.log(5n > 4n); // true
console.log(5n < 4n); // false
console.log(5n === 5); // false (不同类型)
console.log(5n == 5); // true (类型强制转换)
注意最后两行。使用==
时,BigInt和常规数字被认为是相等的,但使用===
时则不是。这是因为===
检查值和类型的平等。
转换
有时你需要将BigInt和常规数字之间进行转换。下面是如何操作的:
const bigNum = 123456789n;
const regularNum = Number(bigNum);
console.log(regularNum); // 123456789
const backToBigInt = BigInt(regularNum);
console.log(backToBigInt); // 123456789n
当将大BigInt转换为常规数字时要小心,因为你可能会丢失精度!
示例
让我们用一些现实世界的例子来运用我们的BigInt知识:
1. 计算阶乘
function factorial(n) {
if (n === 0n) return 1n;
return n * factorial(n - 1n);
}
console.log(factorial(20n)); // 2432902008176640000n
这个函数可以计算比常规JavaScript数字可能的大得多的阶乘!
2. 处理真正的大质数
function isPrime(n) {
if (n <= 1n) return false;
for (let i = 2n; i * i <= n; i++) {
if (n % i === 0n) return false;
}
return true;
}
const largeNumber = 2n ** 100n - 1n;
console.log(isPrime(largeNumber) ? "质数" : "非质数"); // 非质数
这个函数可以检查远超常规JavaScript数字限制的数字的素性!
BigInt错误处理
当使用BigInt时,有一些事情需要注意:
try {
const result = 1n + 1; // 这将抛出一个错误
} catch (error) {
console.log("错误:", error.message); // 不能混合BigInt和其他类型
}
try {
const result = Math.sqrt(4n); // 这也将抛出一个错误
} catch (error) {
console.log("错误:", error.message); // 不能将BigInt值转换为数字
}
记住,BigInt只能与其他BigInt进行算术运算,许多Math函数不支持BigInt。
BigInt方法
以下是常用的BigInt方法表格:
方法 | 描述 | 示例 |
---|---|---|
BigInt() | 创建一个BigInt值 | BigInt(123) |
BigInt.asIntN() | 将BigInt值包装为-2^(n-1)和2^(n-1)-1之间的有符号整数 | BigInt.asIntN(3, 5n) // 5n |
BigInt.asUintN() | 将BigInt值包装为0和2^n-1之间的无符号整数 | BigInt.asUintN(3, 5n) // 5n |
BigInt.prototype.toString() | 返回BigInt值的字符串表示 | (123n).toString() // "123" |
BigInt.prototype.valueOf() | 返回BigInt对象的原始值 | Object(123n).valueOf() // 123n |
就这样,伙计们!你现在装备好了,可以处理比天空中星星还要大的数字。记住,能力越大,责任越大 - 慎用你的BigInt!
快乐编码,愿你的数字总是像你的梦想一样大!
Credits: Image by storyset