在过去的 JavaScript 版本中,我们使用原生的 Number 类型来进行数学运算。然而,由于 JavaScript 中 Number 类型的数字精度是有限的,当数字很大或很小时,就会出现精度丢失的问题。为了解决这个问题,ES11 中引入了一个新的 BigInt 类型。
BigInt 类型可以表示任意大的整数,并且可以进行常见的整数运算,例如加减乘除等。在这篇文章中,我们将使用 BigInt 类型来实现一个完整的数学库 Math。
BigInt 类型入门
首先,让我们看一下如何使用 BigInt 类型。BigInt 类型的变量需要以 "n" 结尾,例如:
const x = 1234567890123456789012345678901234567890n; const y = BigInt(123456789);
我们也可以将字符串转换成 BigInt 类型:
const x = BigInt("1234567890123456789012345678901234567890");
BigInt 类型和 Number 类型是不能混用的。在代码中,我们需要将 Number 转换成 BigInt 类型,才能进行运算。
const a = 123; const b = 456; const c = BigInt(a) + BigInt(b);
这样,结果 c 就是 BigInt 类型的值。
实现 Math 库
现在,我们有了 BigInt 类型的基础,开始实现我们的 Math 库吧。首先,我们需要实现加、减、乘、除四个基本运算。
-- -------------------- ---- ------- -------- ------ -- - ------ - - -- - -------- ------ -- - ------ - - -- - -------- ------ -- - ------ - - -- - -------- ------ -- - ------ - - -- -展开代码
这些函数是针对普通的 Number 类型的,我们需要将它们改写成 BigInt 类型的。
-- -------------------- ---- ------- -------- ------ -- - ------ --------- - ---------- - -------- ------ -- - ------ --------- - ---------- - -------- ------ -- - ------ --------- - ---------- - -------- ------ -- - ------ --------- - ---------- -展开代码
接下来,我们需要实现一些常见的数学函数,例如求平方根、三角函数、指数函数等。这些函数可以用数值级数来实现,因为 BigInt 类型比 Number 类型更慢,所以我们需要仔细考虑算法的效率。
以下是求平方根的一个近似算法:牛顿迭代法。
function sqrt(n) { let x = BigInt(n); while (true) { const y = (x + n / x) / 2n; if (y >= x) return x; x = y; } }
我们可以使用类似的方法来实现其他数学函数。这里不再赘述了。
最后,我们需要将这些函数封装成一个 Math 对象。我们可以使用类似原生 Math 对象的方式来封装这些函数。
-- -------------------- ---- ------- ----- ----- - - ---- ----------- -- - ------ --------- - ---------- -- ---- ----------- -- - ------ --------- - ---------- -- ---- ----------- -- - ------ --------- - ---------- -- ---- ----------- -- - ------ --------- - ---------- -- ----- ----------- - --- - - ---------- ----- ------ - ----- - - -- - - - -- - --- -- -- -- -- ------ -- - - -- - -- -- --- ------ --展开代码
示例
现在,我们来使用我们自己实现的 Math2 库做一些例子吧。
const x = BigInt("12345678901234567890"); const y = BigInt("98765432101234567890"); console.log(Math2.add(x, y)); // BigInt("111111111011111111080") console.log(Math2.sub(x, y)); // BigInt("-86419753200000000000") console.log(Math2.mul(x, y)); // BigInt("121932631137123931321135340121246522100") console.log(Math2.div(y, x)); // BigInt("799399979407619833") console.log(Math2.sqrt(x)); // BigInt("3513641826")
总结
BigInt 类型为我们提供了更高的数字精度,让我们可以进行更复杂的数学计算。使用 BigInt 类型,我们可以实现一个完整的数学库 Math,使得 JavaScript 可以满足更多的数学需求。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64c9e3265ad90b6d041879f3