在前端开发过程中,我们经常需要进行数值计算。然而在 JavaScript 中,对于超出 Number 类型表示范围的大整数值,我们常常需要借助第三方库来进行高精度计算。但是,在 ECMAScript 2021 中,新增了一种类型 BigInt,它可以表示任意精度的整数,而无需引入外部库。
BigInt 的基本用法
在 JavaScript 中,使用 BigInt 类型需要在数字后面增加 n 后缀,例如:
const bigIntNum = 1234567890123456789012345678901234567890n;
使用 BigInt 类型的数值也支持各种数学运算,例如:
const bigIntNum1 = 1234567890123456789012345678901234567890n; const bigIntNum2 = 1234567890123456789012345678901234567890n; const sum = bigIntNum1 + bigIntNum2; // 2469135780246913578024691357802469135780n const difference = bigIntNum1 - bigIntNum2; // 0n const product = bigIntNum1 * bigIntNum2; // 15241578753238836750495351562501905441581832571940690056003038439404410413060n const quotient = bigIntNum1 / bigIntNum2; // 1n
BigInt 的注意事项
BigInt 与 Number 类型的区别
BigInt 与 Number 类型之间有以下一些区别:
BigInt 类型不能与 Number 类型相加、相减、相乘,否则会报错。但是 BigInt 类型能与 Number 类型进行除法运算。
BigInt 类型与 Number 类型之间不能相互比较,否则会报错。例如,下面的表达式会报错:
const a = 10n; const b = 10; if (a > b) { console.log('a is greater than b'); }
BigInt 的运算性能
与 Number 类型相比,BigInt 类型的运算性能稍低。因此,如果只需要执行简单的计算,我们可以继续使用 Number 类型,而只在必要的情况下使用 BigInt 类型。
使用 BigInt 实现高精度计算
下面我们来实现一个大整数加法函数,借助 BigInt 类型来进行高精度计算:
// www.javascriptcn.com code example
function bigIntAdd(num1, num2) {
let carry = 0n;
let sum = '';
const len1 = num1.length;
const len2 = num2.length;
for (let i = 1; i <= Math.max(len1, len2); i++) {
const digit1 = i <= len1 ? BigInt(num1[len1 - i]) : 0n;
const digit2 = i <= len2 ? BigInt(num2[len2 - i]) : 0n;
const digitSum = digit1 + digit2 + carry;
if (digitSum > 9n) {
carry = 1n;
sum = String(digitSum % 10n) + sum;
} else {
carry = 0n;
sum = String(digitSum) + sum;
}
}
return carry === 1n ? '1' + sum : sum;
}这个函数的核心思路是模拟手动计算的过程,从低位向高位一位位地进行加法运算。其中,carry 变量表示进位值,digit1 和 digit2 变量表示当前位上两个数值对应的位数,digitSum 变量表示当前位的和。根据 digitSum 是否大于 9n,判断当前位是否有需要进位,然后将进位值传递给下一位进行运算。
函数的使用方法如下:
const num1 = '1234567890123456789012345678901234567890'; const num2 = '9876543210987654321098765432109876543210'; console.log(bigIntAdd(num1, num2)); // 11111111111111111111111111111111111111100
结语
在本文中,我们了解了 ECMAScript 2021 中新增的 BigInt 类型,并学习了如何使用它进行高精度计算。虽然 BigInt 类型相对于 Number 类型的运算性能稍低,但它可以让我们在前端开发过程中避免引入外部库,从而更加便捷地进行高精度计算。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/67d6a3b8a941bf7134c6b35f