在前端领域,我们经常需要处理大数字,例如加密操作、数字处理等。在 ECMAScript 2015 (ES6) 及之前,我们只能使用 Number 类型来处理数字,其最大安全整数是 2^53-1,超过这个范围会导致精度丢失。但是在 ECMAScript 2021 (ES12) 中,引入了 BigInt 类型,可以安全地处理大数字,有效解决精度丢失问题。
BigInt 类型的使用
BigInt 类型用来表示整数,支持任意精度的整数,并且可以进行基本的数学运算。声明一个 BigInt 变量需要在数字后面加上 n 或者使用 BigInt() 构造函数。
const bigNum = 123456789123456789123456789n; const bigNum2 = BigInt(987654321987654321);
注意,BigInt 类型不能与 Number 类型进行混合运算,需要转换为相同类型之后才能进行运算。
const num = 123; const bigNum = 123n; const result = num + bigNum; // 报错,无法进行混合运算 const total = num + Number(bigNum); // 246,将 bigNum 转换为 Number 类型进行运算
BigInt 类型的常用操作
加、减、乘
BigInt 类型的加、减、乘操作与 Number 类型类似,可以使用加号、减号以及乘号进行运算。
const bigNum1 = 123456789n; const bigNum2 = 987654321n; const sum = bigNum1 + bigNum2; // 1111111110n const difference = bigNum2 - bigNum1; // 864197532n const product = bigNum1 * bigNum2; // 121932631137779413n
除
BigInt 类型的除法操作与 Number 类型略有不同,使用 “/” 运算符会返回一个向下取整的 BigInt 类型的值,例如:7n / 2n 的结果是 3n。
const dividend = 987654321987654321n; const divisor = 123456789n; const quotient = dividend / divisor; // 7999999963n,向下取整的结果
需要注意的是,BigInt 类型不能使用除数为 0 的操作,会导致运行时错误。
模
BigInt 类型的模操作也与 Number 类型略有不同,使用 “%” 运算符进行运算。
const dividend = 987654321987654321n; const divisor = 123456789n; const remainder = dividend % divisor; // 52059297n
进制转换
由于 BigInt 类型可以存储任意大的整数,因此在处理超过 Number 类型限制的数字时十分有用。在 BigInt 类型中,可以使用 toString() 方法将数字转换为不同的进制字符串,也可以使用 BigInt.asUintN() 和 BigInt.asIntN() 方法将 BigInt 类型的数字截取为指定位数的整数。
const bigNum = 123456789123456789n; const octalNum = bigNum.toString(8); // "533574124076663362311n" const hexNum = bigNum.toString(16); // "1b39b9ecf10b998384611n" const binaryNum = bigNum.toString(2); // "1101100111001111101100111100111010000010111100011011010100111001101n" const truncatedNum = BigInt.asUintN(32, bigNum); // 3688781205n
总结
BigInt 类型是 ECMAScript 2021 引入的一项重要特性,为我们在 JavaScript 中处理大数字时提供了便利。BigInt 类型支持任意精度的整数运算,可以防止精度丢失,同时还有进制转换和截取等实用功能。需要注意,BigInt 类型不能与 Number 类型进行混合运算,需要进行类型转换。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/64e5d832f6b2d6eab31538e4