在进行大数计算时,JavaScript 遇到的一个问题就是数据溢出。在过去,人们需要手动编写大数计算工具或者使用第三方库进行大数计算。但是,随着 ECMAScript 2021 的发布,JavaScript 引入了一种新的数据类型:BigInt,它可以帮助我们避免这个问题。
BigInt 是什么?
在 JavaScript 中,Number 类型只能处理 -2^53 和 2^53 之间的整数。如果要进行更大的计算,就必须使用 BigInt。BigInt 内部使用了一个 64 位的整数,它可以处理任意长度的整数,相当于一个高精度整数类型。
BigInt 的语法和 Number 类型相似,但是需要在数字后面添加大写的字母 "n":
const bigNum = 10n;
BigInt 和 Number 相互转换
BigInt 和 Javascript 的 Number 类型之间并不兼容,它们之间无法直接进行计算操作。但是,在 ECMAScript 2021 中,我们可以使用一些新的函数来进行类型转换。
BigInt -> Number
如果需要将 BigInt 转换为 Number 类型,可以使用 Number()
函数。不过,在将大数转换为 Number 类型时,可能会出现精度丢失的情况。
const bigNum = 9007199254740992592n; // 2^53 const num = Number(bigNum); // 9007199254740993000 const bigNum = 1234567890123456789012345678901234567890n; const num = Number(bigNum); // +Infinity
在转换 BigInt 为 Number 类型时,可能会出现精度丢失的情况。在上面的例子中,2^53 被转换为了一个近似的,但是不准确的数字。
Number -> BigInt
如果需要将 Number 类型转换为 BigInt,可以使用 BigInt()
函数。
const num = 123; const bigNum = BigInt(num); // 123n
字符串转换为 BigInt
BigInt 还支持字符串类型的输入,用户可以在字符串前面添加字母 "n" 来创建 BigInt 类型。
const bigStr = "1234567890123456789012345678901234567890n"; const bigNum = BigInt(bigStr);
因为它需要处理两种常见的字符串类型,所以 BigInt 也可以接收以 2、8、10、16 为基数的字符串。
const bigBinaryStr = "0b101011010n"; const bigOctalStr = "0o755n"; const bigHexStr = "0xafn"; const bigBinary = BigInt(bigBinaryStr); // 173n const bigOctal = BigInt(bigOctalStr); // 493n const bigHex = BigInt(bigHexStr); // 175n
示例代码
在这个例子中,我们将显示如何使用 BigInt 处理一个足够大的整数,超出了 Number 类型的范围。
-- -------------------- ---- ------- ----- ------ - ------- -- -------- -- -- ------ ---- ----- --- - --------------- -- -------- -------------------- ----------------- ----- --------- - ------------------ -- - ------ ------ ----- --------- - ------------------ -- ------- ------ -----------------------
结论
BigInt 是 ECMAScript 2021 中引入的一种新的数据类型,它可以帮助我们处理任意长度的整数,避免了 JavaScript 中 Number 类型的数据溢出问题。
虽然 BigInt 和 Number 之间目前没有直接的转换方法,我们可以使用 Number()
和 BigInt()
函数进行类型转换,并且通过字符串转换避免了精度丢失的问题。
在使用 BigInt 时,需要注意代码效率问题。BigInt 的计算效率较低,在进行复杂运算的时候建议使用专门的高精度计算库而不是直接使用 BigInt 类型。
本文只是为大家提供了最基本的知识,希望对您有所帮助。在您实际的编程工作中,可以根据需要更加深入地学习 BigInt 的知识,这将能帮助您更好地实现您的代码。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/674c6b36a336082f254136c5