ES9:BigInt 的使用及如何在代码中使用大数
在日常的编程工作中,我们常常需要处理大数问题,比如超过 JavaScript 所能表示的 Number.MAX_SAFE_INTEGER
限制的整数运算等。ES9 (ECMAScript 2018) 推出了一种新的数据类型 BigInt,来解决这一问题。本文将介绍 BigInt 的使用及在代码中使用大数的方法。
一、ES9 中的 BigInt
BigInt 是一种新的基本数据类型,用于表示任意大小的整数,它可以安全地表示和操作大整数,最大可以处理的位数为 2⁵³ - 1。
BigInt 被用于处理一些超过安全整数范围的计算任务。一个安全整数指的是为了精确表示之而在 JavaScript 中所能表示的最大整数。
BigInt 类型字面量以 n
结尾:
console.log(2n ** 53n) // 9007199254740992n
BigInt 也可以使用 BigInt()
构造函数创建:
const n = BigInt("9007199254740992"); console.log(n) // 9007199254740992n
二、BigInt 的基本操作
BigInt 支持基本的数学运算符:+
、-
、*
、/
、%
、**
运算符。
const x = 123456789012345678901234567890123456n; const y = 987654321098765432109876543210987654n; console.log(x + y) // 1111111110111111111011111111101111110n console.log(x - y) // -86419753208641975320864197531790198n console.log(x * y) // 121932631137021795800466736065508927637173373392482014145422718236299960864664n console.log(x / y) // 0n console.log(x % y) // 123456789012345678901234567890123456n console.log(x ** y) // RangeError: BigInt too big to convert
注意:BigInt 与普通数之间运算,需要转为 BigInt 类型,否则会自动转换为普通数。另外值得注意的一点是,两个 BigInt 值之间不能用 <
、>
、==
等运算符进行比较,需要使用 BigInt.prototype.compare()
方法。
const x = 123456789012345678901234567890123456n; console.log(x === 123456789012345678901234567890123456) // false console.log(x == 123456789012345678901234567890123456) // false console.log(x + 1n) // 123456789012345678901234567890123457n console.log(x > 1n) // true console.log(x.compare(1n) > 0) // true
三、如何在代码中使用大数
以计算斐波那契数列作为示例,说明如何使用 BigInt 在代码中处理大数:
-- -------------------- ---- ------- -------- ------------ - -- -- --- -- ------ --- --- - - --- - - --- --- ---- - - --- - - -- ---- - --- -- - --- ----- - ------ -- - ---------------------------- -- ----------------------
通过上述代码可以看出,使用 BigInt 的方法与普通的数值类型差别较小。当然,在实际开发过程中可能会遇到更为复杂的运算场景,针对具体情况选择合适的 BigInt 方法即可。
四、总结
BigInt 是一种新的基本数据类型,用于表示任意大小的整数,最大可以处理的位数为 2⁵³ - 1。BigInt 支持基本的数学运算符,并且可以很容易地使用它来处理一些超出 JavaScript 安全整数范围的计算任务。当然,也要注意它与普通数之间运算的不同之处。
当我们遇到需要处理大数类型的需求时,可以使用 BigInt 来实现,它能够避免因为位数过大而引起的精度问题,使程序更加稳定可靠。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64ad2a8248841e9894953e84