在前端开发中,我们经常需要处理一些大数运算,比如计算大整数的阶乘、大质数的判断等等,这些运算如果使用 JavaScript 中的 Number 类型进行计算,很容易出现精度丢失的问题。为了解决这个问题,ECMAScript 2018 引入了 BigInt 类型,可以用来进行精确计算。
BigInt 类型简介
BigInt 是一种新的数据类型,用来表示任意精度的整数。在 JavaScript 中,Number 类型只能表示 $-2^{53}$ 到 $2^{53}$ 之间的整数,而超过这个范围的整数就会出现精度丢失的问题。BigInt 类型则没有这个限制,可以表示任意大的整数。
BigInt 类型的定义方式为在整数后面加上一个 n,例如:
const bigInt = 123456789012345678901234567890n;
需要注意的是,BigInt 类型不能与 Number 类型进行混合运算,如果需要进行运算,则需要将 Number 类型转换成 BigInt 类型。
使用 BigInt 进行精确计算
加法、减法、乘法
BigInt 类型支持基本的加、减、乘运算,可以使用加号、减号、乘号进行运算,例如:
const a = 12345678901234567890n; const b = 98765432109876543210n; const c = a + b; // 111111111111111111100n const d = a - b; // -86419753208641975320n const e = a * b; // 12193263113702179596379446958989341900n
除法、取模
BigInt 类型也支持除法和取模运算,但是需要注意的是,除法运算只能得到整数部分,不能得到小数部分,如果需要计算小数部分,需要使用其他方法。
const a = 12345678901234567890n; const b = 9876543210n; const c = a / b; // 1249999987n const d = a % b; // 1234567999n
指数运算
BigInt 类型也支持指数运算,可以使用双星号进行计算,例如:
const a = 2n; const b = 100n; const c = a ** b; // 1267650600228229401496703205376n
进制转换
在 BigInt 类型中,可以使用 toString 方法将一个 BigInt 类型的整数转换成指定进制的字符串,例如:
const a = 12345678901234567890n; const b = a.toString(16); // 2bdc97e1e0b8d4a const c = a.toString(2); // 10101101110110011001111100011111000010110100011101001011010010
需要注意的是,在转换成二进制字符串时,需要使用 toString(2) 方法,而不是 toString(0b2) 方法。
示例代码
下面是一个使用 BigInt 类型进行大数运算的示例代码,可以用来计算一个数的阶乘:
-- -------------------- ---- ------- -------- ------------ - --- ------ - --- --- ---- - - --- - -- -- ---- - ------ -- -- - ------ ------- - ----------------------------- -- ---------------------------------------------------------------------------------------------------------------------------------------------------------------
总结
ECMAScript 2018 中的 BigInt 类型为 JavaScript 提供了一种新的数据类型,可以用来进行精确计算。在处理大数运算时,我们可以使用 BigInt 类型来避免精度丢失的问题,从而得到更加准确的结果。需要注意的是,在使用 BigInt 类型时,需要注意其与 Number 类型的转换问题,以及除法运算只能得到整数部分的问题。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/6516a21f95b1f8cacdef7335