在计算机科学中,数字是基础,但在 JavaScript 中,数字有一个限制,它们不能无限制地增长,当达到 JavaScript 可以处理的最大数字范围时,会出现精度丢失的问题。在 ES11 中引入的 BigInt 类型可以解决这个问题。BigInt 类型是一种可以表示任意精度整数的新类型,可以处理比 Number 类型更大的数字。本文就将介绍 BigInt 类型的使用,以及如何使用 BigInt 来解决大数计算问题和十六进制的表示问题。
BigInt 类型和使用
在 ES11 (ES2020)中,BigInt 类型是一个新的内置对象类型,它可以表示任意精度的整数。它不仅解决了 JavaScript 中数字的精度问题,而且还比 JavaScript 的 Number 类型更安全,因为它可以避免在数字处理中浮点误差的问题。
BigInt 类型的定义方式跟 Number 类型差不多,只不过在数字后面加上 n 来表示:
const smallNumber = 123; const bigNumber = 12345678901234567890n;
需要注意的是,BigInt 类型不能与 Number 类型混合计算,因此必须要显式地将 BigInt 转换为 Number,或者将 Number 转换为 BigInt:
const a = 10n; const b = 5; console.log(a + BigInt(b)); // 15n console.log(Number(a) + b); // 15
从上述代码可以看出,即使一个是 BigInt 类型,另一个是 Number 类型,使用 BigInt() 进行转换后相加会得到一个 BigInt 类型的结果。
BigInt 类型也支持其他操作符和函数,例如乘法、除法、取模等操作。所有使用 Number 类型的运算都可以使用 BigInt 类型进行运算。
大数计算
因为 BigInt 类型可以表示任意精度整数,所以它非常适合解决大数计算问题。例如,如果需要计算两个非常大的整数的和或积,使用 Number 类型会出现精度问题或溢出问题。而使用 BigInt 类型可以轻松解决这个问题,例如:
const result = 12121212121212121212121212121212n + 1234567891011121314151617181920n; console.log(result); // 12121212122446782423357083393132n
如上述代码,就可以使用 BigInt 类型进行大数计算,而不用担心精度和溢出问题。
除非必须转换为字符串,否则不要将 BigInt 转换为 Number,因为将 BigInt 转换为 Number 会出现精度丢失的情况。
十六进制的表示
在 JavaScript 中,表示二进制、八进制和十进制的值都是很简单的,但是对于十六进制,却需要一些特殊的处理。在 ES6 中,可以使用前缀 0x 来表示十六进制数,例如:
const hexNumber = 0xFF; // 255
但是这种方式仅限于表示的数值较小的情况,因为在 JavaScript 中一个数值不能超过 Number.MAX_SAFE_INTEGER。
使用 BigInt 类型可以表示大的十六进制数。直接使用 BigInt() 进行转换是不行的,因为 BigInt() 函数只支持 10 进制的整数。要使用 BigInt 类型表示十六进制的值,必须使用字符串,例如:
const hexNumber = BigInt('0xFFFFFFFFFFFFFFFF'); // 18446744073709551615n
如上述代码所示,使用 BigInt() 函数并将一个十六进制字符串作为参数即可。大多数情况下,可以在字符串前面添加 0x 前缀来指示十六进制数,例如:
const hexNumber = BigInt('0x123456789abcdef0'); // 1311768467463790320n
这样就可以使用 BigInt 类型来表示完整的十六进制数,而不必担心精度问题。
总结
ES11 中增加的 BigInt 类型可以解决 JavaScript 中数字精度问题,可以表示任意精度的整数。在使用 BigInt 类型时,需要注意与 Number 类型的区别和类型转换。此外,BigInt 类型还可以用来解决大数计算问题和十六进制的表示问题。要使用 BigInt 类型表示一个十六进制数,可以使用 BigInt() 函数并将十六进制字符串作为参数传递给它。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65af292fadd4f0e0ff890e92