如果你是前端开发人员,那么你肯定知道 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 作为参数。例如:
const bigInt1 = BigInt(9007199254740992) const bigInt2 = BigInt('9007199254740993') const bigInt3 = BigInt(bigInt1)
您还可以使用 n
后缀将数字文字直接转换为 BigInt。例如:
const bigInt4 = 9007199254740994n const bigInt5 = 9007199254740995n
使用 BigInt 的变量在运算时需要注意,与 Number 不同的是,将两个 BigInt 相加时,您必须使用 +
运算符,而不能使用 +
运算符。例如:
const bigInt6 = bigInt4 + bigInt5 // Error const bigInt7 = bigInt4 * bigInt5 // Correct
在 BigInt 和其他类型(包括 Number)之间进行运算时,BigInt 值会被转换为 Number 类型,这可能会产生精度问题。为了避免这种情况,可以使用比较运算符(例如 ==
或 >
) 或使用 BigInt 提供的运算符(例如 +
或 -
)。
const bigInt8 = 9007199254740993n const number1 = 9007199254740992 const result1 = bigInt8 > number1 // true const result2 = bigInt8 + BigInt(number1) // 18014398509481985n
重要的是要注意,您不能在 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