JavaScript - BigInt:处理真正的大数

你好,有抱负的程序员们!今天,我们将踏上一段激动人心的旅程,探索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就像馅饼一样简单。你有两个选择:

  1. 在整数末尾附加'n'
  2. 使用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