大部分开发人员都知道 JavaScript 中的数字精度问题:当我们处理大于 2 的 53 次幂的数字时,JavaScript 会失去精度,从而得到错误的结果。这是因为在 JavaScript 中,数字都是使用浮点数存储的(IEEE 754 标准)。因此,我们需要 BigInt。BigInt 是在 ES10 中引入的新的原始数据类型,它可以处理任意大且精确的整数。
BigInt 的优点
BigInt 与普通数字最大的不同是它不使用 IEEE 754 标准存储数字。相反,它以字符串的形式存储数字,因此可以处理任意长度的整数。BigInt 还支持普通数字的所有运算:加、减、乘和除。而且,BigInt 支持逻辑运算符、比较运算符和位运算符。
BigInt 的语法
要创建 BigInt,我们可以使用 BigInt()
函数将一个数字转换为一个 BigInt。我们还可以在数字文本的末尾添加 n
,来明确我们要创建一个 BigInt。
const max = BigInt(Number.MAX_SAFE_INTEGER); // 使用 Number.MAX_SAFE_INTEGER 创建 BigInt const big = 1234567890123456789012345678901234567890n; // 直接创建一个 BigInt
值得注意的是,我们不能将普通数字与 BigInt 相加。如果我们这样做,会得到一个 TypeError。
const sum = 123 + 456n; // TypeError: Cannot mix BigInt and other types, use explicit conversions
因此,我们必须使用 BigInt()
函数将数字转换为 BigInt。
BigInt 的运算
除了 +
和 -
,BigInt 还支持 *
和 /
运算,以及逻辑运算符、比较运算符和位运算符。
-- -------------------- ---- ------- ----- --- - --- ----- --- - --- ----- ----- - --- - ---- -- -- ----- --- - ----- - ---- -- -- ----- ---- - --- - ---- -- -- ----- ------ - ---- -- ----- -- ----- - ----- -- ---- ----- --------- - ----- -- ---- -- --- ----- ---------- - --- -- ---- -- --
我们还可以使用 BigInt.asIntN()
和 BigInt.asUintN()
函数将 BigInt 转换为指定位数的整数。
const num = BigInt.asIntN(8, 200n); // -56n
BigInt 和普通数字的互操作
如果需要在 BigInt 和普通数字之间转换,可以使用 BigInt()
和 Number()
函数。
const big = 1234567890123456789012345678901234567890n; const num = Number(big); // 将 BigInt 转换为普通数字 const big2 = BigInt(num); // 将普通数字转换为 BigInt
BigInt 的应用
BigInt 可以用于任何需要处理大整数,并且需要高精度的场景,例如密码学算法、位运算、算数运算等等。下面是一个快乐的示例:使用 BigInt 计算斐波那契数列中第 n 个数字。
-- -------------------- ---- ------- -------- ------ - -- -- -- -- ------ --- -- -- --- -- ------ --- --- - - --- --- - - --- --- ---- - - -- - -- -- ---- - ----- - - - - -- - - -- - - -- - ------ -- - ---------------------- -- ----------------------
总结
BigInt 原始数据类型是 ES10 中最重要的新增功能之一。它提供了处理大整数的强大能力,可以帮助我们解决数字精度问题。虽然在性能上会比普通数字差一些,但在需要处理大整数或需要高精度计算的场景下,BigInt 能发挥出其真正的价值。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64d0ecbab5eee0b5257f1680