ES9 中的 BigInt,处理超大数字的好方法
在过去,JavaScript 中的数字都是 double 类型,最大值为 2^53-1,也就是 9007199254740991。如果需要处理更大的数字,需要使用 BigInt。
ES9 中引入了 BigInt,可以表示任意精度的整数,而且不会失去精度,解决了在 JavaScript 中需要处理超大数字时的困扰。
- 创建 BigInt
在 JavaScript 中,可以通过在数字后加 n 来创建一个 BigInt。例如:
const bigint = 1234567890123456789012345678901234567890n;
也可以使用 BigInt() 函数将一个 Number 转成 BigInt,这个方法必须在数字后面加一个 "n"。
const bigint = BigInt(1234567890123456789012345); //1234567890123456789012345n
- BigInt 运算
在 BigInt 中,支持大多数的运算符,例如 +、-、*、/、%、<<、>>、>>>、&、|、^ 等等。
如果一个运算符的两个操作数类型不一致,那么 BigInt 运算符会将另一个操作数转换为 BigInt。
const a = 20n; const b = 100n; console.log(a + b); // 120n console.log(a - b); // -80n console.log(a * b); // 2000n console.log(a / b); // 0n, 因为它是取整数运算
- BigInt 和 Number 的转换
如果需要将 BigInt 转换成 Number,可以使用 Number() 函数,但是,在超过 Number.MAX_SAFE_INTEGER 的时候,转换结果会是不准确的。
console.log(Number(1234567890123456789012345n)); // 1.2345678901234568e+24 console.log(Number.MAX_SAFE_INTEGER + 1); // 9007199254740992 console.log(Number.MAX_SAFE_INTEGER + 1n); // 报错,因为加上 n 之后就不是 Safe Integer 了
反过来,将 Number 转成 BigInt,使用 BigInt() 函数即可。
console.log(BigInt(1234567890123456789012345)); // 1234567890123456789012345n
- BigInt 和字符串之间的转换
可以使用 toString() 方法将 BigInt 转换成字符串。
const bigint = 1234567890123456789012345678901234567890n; console.log(bigint.toString()); // "1234567890123456789012345678901234567890"
也可以直接用字符串来创建 BigInt。
const bigint = BigInt("1234567890123456789012345678901234567890");需要注意的是,如果字符串字符长度超过 Number.MAX_SAFE_INTEGER,则无法准确处理。
- 示例代码
下面是一个例子,计算一百个整数的阶乘之和。在普通数字时会得到 Infinity,而通过 BigInt 可以准确计算。
// www.javascriptcn.com code example
function getFactorial(n) {
if (n === 1n) return 1n;
return n * getFactorial(n - 1n);
}
function getFactorialSum(n) {
let result = 0n;
for (let i = 1n; i <= n; i++) {
result += getFactorial(i);
}
return result;
}
console.log(getFactorialSum(100n).toString());
// 输出 "4037913708486130000000....",总共 157 位数字- 学习和指导意义
BigInt 的引入使得 JavaScript 对于超大数值的计算变得更加便捷和准确。但是,需要注意的是,使用 BigInt 运算符来处理 BigInt 的数字会比使用常规运算符要慢得多,因为 BigInt 运算符需要更多的计算。因此,在对待大量数据的场景下,需要谨慎使用。
在实际开发中,我们可以使用 BigInt 来进行加密算法的开发,比如 RSA 算法等等。另外,在一些以数值计算为主的场景下,BigInt 也能够发挥很好的作用。因此,掌握 BigInt 的使用是非常重要的。
总之,ES9 中的 BigInt 提供了一种方便、可靠的方法来处理超大数字,深入了解和学习 BigInt 的使用,对于开发人员来说是非常有帮助的。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d6798ba941bf7134c3e56d