解密神器 ES2021 的 BigInt 函数编程解决方案!

阅读时长 5 分钟读完

如果你是前端开发人员,那么你肯定知道 JavaScript 语言的弱点之一是在数字运算方面表现不是很好。这是由于 JavaScript 的 Number 类型采用的是 IEEE 754 双精度浮点数表示法,这在处理大整数时,很容易出现舍入误差。

不过好消息是,ES2021 引入了一种有用的新类型 - BigInt,可以让开发人员更容易地处理大整数。在这篇文章中,我们将深入讨论 BigInt 的实现和用法。下面让我们开始吧!

BigInt 简介

问题在于 JavaScript 的 Number 类型只能准确表示 -9007199254740991(-2^53 + 1)到 9007199254740991(2^53 - 1)之间的整数,而任何大于或小于此范围的数字都被舍入为这个范围的边界值。这意味着如果你需要处理超出此范围的数字,你需要使用其他解决方案。

BigInt 是一种新的、原生的 JavaScript 类型,可以处理任意大小的整数。这意味着开发人员可以使用 BigInt 解决处理超过 Number 范围的整数的问题。

如何使用 BigInt

您可以使用 BigInt 函数来创建 BigInt。BigInt 函数接受数字、字符串或另一个 BigInt 作为参数。例如:

您还可以使用 n 后缀将数字文字直接转换为 BigInt。例如:

使用 BigInt 的变量在运算时需要注意,与 Number 不同的是,将两个 BigInt 相加时,您必须使用 + 运算符,而不能使用 + 运算符。例如:

在 BigInt 和其他类型(包括 Number)之间进行运算时,BigInt 值会被转换为 Number 类型,这可能会产生精度问题。为了避免这种情况,可以使用比较运算符(例如 ==>) 或使用 BigInt 提供的运算符(例如 +-)。

重要的是要注意,您不能在 BigInt 上使用 Math 对象或运算符。这意味着如果您需要执行常见的数学操作(例如三角函数),那么您需要按照常规方法实现它们。

BigInt 示例

让我们看一个实际的示例,使用 BigInt 来解决 Project Euler 第 20 个问题。在此问题中,我们需要计算 100 的阶乘的数字总和。以下是解决方案的实现:

-- -------------------- ---- -------
-------- ----------------- -
  ------ ----------------------------------- ------ -- --- - --------------- ---- --
-
  
-------- ------------ -
  --- ------ - --
  --- ---- - - --- - -- -- ---- -
    ------ -- -
  -
  ------ ------
-

-------- ---------------- -
  ----- ------ - ---------------
  ------ ----------------------
-

----- ------ - ---------------- -- ---

在这个实现中,factorial 函数计算所需的阶乘。使用 BigInt 可以避免舍入误差,并使用 BigInt(1) 作为起始值。

getSumOfDigits 函数接受数字并返回其数字总和。

solveProblem20 函数计算 100 的阶乘,并使用 getSumOfDigits 函数计算其数字总和。

最后,在模块的底部,我们调用 solveProblem20 函数并将其结果保存在 answer 变量中。

BigInt 的局限性

BigInt 与 JavaScript 的其他内置类型(例如 Object 或 Number)一样,是有限的。它不能用于索引数组、键对象等。另外,因为 BigInt 是一个新的类型,许多旧的 JavaScript 库可能不支持它。

最后,因为 BigInt 内部表示较大,因此它的运算速度较慢。这意味着在使用 BigInt 时需要注意性能问题。

结论

在本文中,我们介绍了 BigInt,这是 JavaScript 的最新版本 ES2021 中引入的新类型。BigInt 可以用于处理任意大小的整数,避免了处理数字时常常出现的舍入误差。在代码示例中,我们解决了一个实际的问题,展示了 BigInt 的功能和用法。

作为前端开发人员,通过学习 BigInt,将使您的数字运算更加准确,从而避免了大量的麻烦。

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/675083d0050cf9039c134ad1

纠错
反馈