在 JavaScript 中,由于数字类型(Number)采用的是浮点数表示法,会存在精度丢失的问题。特别是处理大数运算时,更容易出现精度问题。但是,在 ES10 中,引入了一种新的数字类型——BigInt,它可以用来表示任意精度的整数,从而解决了 JavaScript 中的精度问题。
BigInt 的数据类型
BigInt 是一种全新的数据类型,用于表示大于 2^53-1 的整数。在 JavaScript 中,可以通过在任意整数后面加上 n 或者调用 BigInt() 函数将其转换成 BigInt 类型数据。
const n = 123456789012345678901234567890n; const m = BigInt("123456789012345678901234567890");
BigInt 的运算
与普通整数类型相似,BigInt 可以通过 +、-、*、/ 等运算符进行数值运算,并且没有精度问题。
const n1 = 123456789012345678901234567890n; const n2 = 987654321098765432109876543210n; const sum = n1 + n2; console.log(sum); // 1111111111111111111111111111111n
需要注意的是,由于 BigInt 与普通整数类型不能相互混用,因此进行数值运算时需要统一转换成 BigInt 类型,否则会报错。
// 错误示例 const n = 123456789012345678901234567890n; const m = 100; const sum = n + m; // Uncaught TypeError: Cannot mix BigInt and other types, use explicit conversions
BigInt 可以与普通整数类型进行比较
BigInt 类型可以与普通整数类型进行比较运算,比较运算的结果是 Boolean 类型。
const n1 = 123456789012345678901234567890n; const n2 = 987654321098765432109876543210n; console.log(n1 > n2); // false const m = 100; console.log(m < n1); // true
需要注意,除了等于运算之外,其他比较运算都可以使用 BigInt 类型和普通整数类型进行比较。等于运算需要先对数据类型进行转换,如下所示。
const n = 123456789012345678901234567890n; const m = 123456789012345678901234567890; console.log(n === BigInt(m)); // true
BigInt 的转换
在实际开发过程中,遇到的数据类型会比较杂乱,因此需要对 BigInt 进行转换。
BigInt 转换成 String
将 BigInt 类型数据转换成字符串使用 toString() 或模板字符串即可,示例代码如下:
const n = 123456789012345678901234567890n; const str1 = n.toString(); const str2 = `${n}`;
BigInt 转换成 Number
将 BigInt 类型数据转换成 Number 类型,可以使用 Number() 函数或者使用位运算符 ~~ 或者 + 进行转换。不过,转换过程需要注意,如果 BigInt 类型数据超出了 JavaScript 中数字类型所能表示的范围,转换结果将会是不确定的。示例代码如下:
const n = 123456789012345678901234567890n; const m1 = Number(n); const m2 = ~~n; const m3 = +n;
Number 转换成 BigInt
将普通整数类型转换成 BigInt 类型,可以使用 BigInt() 函数进行转换。示例代码如下:
const n = 123456789012345678901234567890; const bigint = BigInt(n);
BigInt 的注意事项
虽然 BigInt 只是一种新的数据类型,但是在使用 BigInt 进行数字运算时,需要注意一些细节问题,以免出现错误。
BigInt 与普通整数类型不能进行混用
在进行数值运算时,BigInt 类型不能和普通整数类型进行混用,需要先进行类型转换。否则会报错。
const n = 123456789012345678901234567890n; const m = 100; const sum = n + m;
BigInt 不能进行位运算
由于 BigInt 类型数据过于庞大,所以不能进行位运算。
const n = 123456789012345678901234567890n; const x = n >> 2; // TypeError: Cannot perform '>>' on BigInt values
BigInt 不能进行 Math 对象的计算
由于 Math 对象中的方法只支持浮点数,BigInt 不能进行 Math 的相关运算。
const n = 123456789012345678901234567890n; const x = Math.sqrt(n); // TypeError: Cannot convert a BigInt value to a number
总结
通过使用 BigInt,可以解决 JavaScript 中的精度问题,特别是处理大数运算时,更容易出现精度问题。注意,因为 BigInt 与普通整数类型不能混用,因此需要先进行类型转换。在实际开发过程中,大量使用 BigInt 的情况也比较少,但在某些场景下尤其是需要精准处理数据时,它是非常实用的工具。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/647e899c48841e9894e3c61a