在 JavaScript 中,数字是以 64 位浮点数的形式存储的。这对于大部分计算来说已经足够了,但对于一些需要处理超过 253 的大数运算来说就有些捉襟见肘了。于是 ECMAScript2015 引入了 BigInt 类型,它可以精确表示任意大的整数,可以做到精度不会丢失,成为了新的数字类型。
如何创建 BigInt
BigInt 类型的创建方式很像 Number 类型,只需要在数字后面加个 n 或是用 BigInt()
函数将数字转换为 BigInt 类型,如1234567890123456789123456789n
或者BigInt(1234567890123456789123456789)
。
以下是一个创建 BigInt 类型的示例代码:
const bigNum1 = 1234567890n; const bigNum2 = BigInt("123456789012345678901234567890");
如何进行 BigInt 的运算
BigInt 可以进行所有数字类型支持的基本运算,如加、减、乘、除、求余等,但需要注意的是,BigInt 与 Number 类型之间的运算需要进行类型转换,否则会出现预期之外的结果。
以下是常见的 BigInt 运算方法:
const bigNum1 = 123456789098765432101234567890n; const bigNum2 = 987654321012345678901234567890n; const bigNum3 = bigNum1 + bigNum2; const bigNum4 = bigNum1 - bigNum2; const bigNum5 = bigNum1 * bigNum2; const bigNum6 = bigNum1 / bigNum2; const bigNum7 = bigNum1 % bigNum2;
运算符号同 Number 类型,注意 BigInt 和 Number 进行运算时的类型转换,例如:
const bigNum1 = 123456789012345678901234567890n; const num1 = 1234567890123456789; const result = bigNum1 + BigInt(num1);
另外需要注意,在 BigInt 中除法运算会向下取整。例如:
const num1 = 9n, num2 = 10n; console.log(num1 / num2); // 输出 0n
如何进行 BigInt 的位运算
位运算是 BigInt 特有的运算方式。BigInt 运算支持常见的位运算操作符,如按位与、按位或、按位异或、左移、右移等。以下是常见的 BigInt 按位运算方法:
const bigNum1 = 100n; const bigNum2 = 110n; const bigNum3 = bigNum1 & bigNum2; // 输出 100n,即按位与的结果 const bigNum4 = bigNum1 | bigNum2; // 输出 110n,即按位或的结果 const bigNum5 = bigNum1 ^ bigNum2; // 输出 10n,即按位异或的结果 const bigNum6 = bigNum1 << 2n; // 输出 400n,即左移两位的结果 const bigNum7 = bigNum1 >> 1n; // 输出 50n,即右移一位的结果
如何将 BigInt 转换成 Number
由于 BigInt 可以表示的范围比较大,在某些场景下,比如进行合并排序算法、统计奇偶数的数量等操作需要将 BigInt 转换成 Number。
BigInt 转换成 Number 是需要特别注意的,需要注意转换的过程中可能会出现溢出的情况。可以使用 Number()
函数转换 BigInt,但是需要注意超出最大安全数值范围的 BigInt 实例转换成 Number 时会丢失精度,因此需要格外小心。
以下是 BigInt 转换成 Number 的方法,需要注意精度问题:
const n1 = BigInt(Number.MAX_SAFE_INTEGER) + 10n; const n2 = Number(n1); console.log(n1); // 输出 9007199254740992510n console.log(n2); // 输出 9007199254740993000,已经丢失精度
总结
BigInt 类型的引入可以更好地处理大数的运算问题,同时也需要我们在使用 BigInt 类型时注意类型转换、精度控制等问题,才能发挥它的最大作用。
参考链接
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64a53bec48841e98941bbca3