在 JS 中,数字运算经常会遇到误差和精度问题,BigInt 可以解决这些问题。BigInt 是一种新的基本数据类型,它可以表示任意精度的整数。
在 ECMAScript 2019 (ES10) 中,BigInt 受到了增强支持。其中一个重要的更新是解决 BigInt 相加产生精度问题的解决方案。在之前版本中,当两个很大的数字相加时,会产生精度丢失的问题,但是在 ES10 中,使用 BigInt 可以避免这种情况。
BigInt 的使用
BigInt 可以通过在数字后加 n
来创建:
const bigNum = 999999999999999999999999999999n;
或者可以使用 BigInt 构造函数:
const bigNum = BigInt("999999999999999999999999999999");
注意,在必要的情况下,需要使用 BigInt 进行运算。例如:
const big1 = 99999999999999999999999999999n; const big2 = 99999999999999999999999999999n; // 正确方式 const sum = big1 + big2; // 错误示范 const sum2 = big1 + 123;
解决 BigInt 相加产生精度问题的解决方案
在 ES10 中,引入了一种新的函数,它通过将 BigInt 转换为字符串,然后解析为指定的进制,最后再将其转换回 BigInt 类型来解决 BigInt 相加时产生精度问题的方法。该函数名叫做 BigInt.asIntN
和 BigInt.asUintN
。
BigInt.asIntN
返回一个值,它等于将 BigInt 转换为指定位数的有符号整数:
const a = 2n ** 64n - 1n; const b = BigInt.asIntN(64, a);
BigInt.asUintN
返回一个值,它等于将 BigInt 转换为指定位数的无符号整数:
const a = 2n ** 64n - 1n; const b = BigInt.asUintN(64, a);
示例代码
以下是 BigInt 相加时产生精度问题的代码:
const a = 9007199254740991n; const b = 1234567890123456789n; const c = a + b; console.log(c); // 输出:1234576897323716780n
使用 BigInt.asIntN
和 BigInt.asUintN
函数解决此问题的代码:
const a = 9007199254740991n; const b = 1234567890123456789n; const c = BigInt.asUintN(64, a) + BigInt.asUintN(64, b); console.log(c); // 输出:1234576897323716780n
总结
BigInt 可以解决 JS 中数字运算的误差和精度问题,而在 ECMAScript 2019 (ES10) 中,BigInt 受到了增强支持。其中重要的更新是解决 BigInt 相加产生精度问题的解决方案,它提供了 BigInt.asIntN
和 BigInt.asUintN
函数来解决这个问题。正确使用 BigInt 和这些新功能可以帮助我们编写更可靠的 JS 代码。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64bf6fc59e06631ab9bce651