在 JavaScript 中,处理大数字时常常会遇到精度丢失的问题。这是因为 JavaScript 中的数字类型只能表示 53 位精度的整数和浮点数,而无法表示更大的数字。这个问题在处理金融数据、密码学等领域尤其严重。在 ECMAScript 2020 (ES11) 中,新增了 BigInt 类型,可以很好地解决这个问题。
BigInt 类型介绍
BigInt 类型是一种新的原始数据类型,用于表示任意精度的整数。在 JavaScript 中,它用后缀 n
来表示。例如,12345678901234567890n
就是一个 BigInt 类型的整数。
BigInt 类型的优点是可以表示任意大的整数,不会出现精度丢失的问题。同时,也支持常见的算术运算和位运算。
BigInt 类型的使用
创建 BigInt 类型的值
创建 BigInt 类型的值有多种方法。一种常见的方法是使用 BigInt()
函数将其他数据类型转换为 BigInt 类型,例如:
const a = BigInt(12345); // 将数字 12345 转换为 BigInt 类型 const b = BigInt('12345678901234567890'); // 将字符串 '12345678901234567890' 转换为 BigInt 类型 const c = 12345678901234567890n; // 直接创建 BigInt 类型的整数
进行算术运算
BigInt 类型支持常见的算术运算,例如加减乘除、取余等。需要注意的是,运算符 +
在 BigInt 类型中表示加法,而不是字符串拼接。
const a = 12345678901234567890n; const b = 98765432109876543210n; const c = a + b; // 111111111111111111100n const d = a * b; // 1219326311370217951115518018258767650n const e = b / a; // 7n const f = b % a; // 6666666666666666660n
进行位运算
BigInt 类型也支持常见的位运算,例如按位与、按位或、按位异或等。需要注意的是,位运算符 <<
和 >>
在 BigInt 类型中表示左移和右移,而 >>>
则表示逻辑右移。
const a = 0b1100n; const b = 0b1010n; const c = a & b; // 0b1000n const d = a | b; // 0b1110n const e = a ^ b; // 0b0110n const f = a << 1n; // 0b11000n const g = a >> 1n; // 0b0110n const h = a >>> 1n; // 0b0110n
BigInt 类型的注意事项
虽然 BigInt 类型可以表示任意大的整数,但是它也有一些限制和注意事项。
首先,BigInt 类型不能与普通数字类型混合运算,必须进行类型转换。例如:
const a = 12345; const b = 67890n; const c = a + b; // 报错,无法进行混合运算 const d = a + Number(b); // 67890 + 12345 = 80235
其次,BigInt 类型不能用于比较运算符 <
、>
、<=
、>=
中,但可以用于相等运算符 ==
、!=
中。例如:
const a = 12345n; const b = 67890n; const c = a < b; // 报错,无法进行比较运算 const d = a == b; // false
最后,BigInt 类型也不能用于一些内置函数中,例如 Math.sqrt()
、Math.pow()
等。
示例代码
下面是一个使用 BigInt 类型计算斐波那契数列的示例代码:
-- -------------------- ---- ------- -------- ------------ - --- - - --- - - --- --- ---- - - --- - - -- ---- - --- -- - --- - - --- - ------ -- - ----------------------------- -- ----------------------
总结
BigInt 类型是 ECMAScript 2020 (ES11) 中新增的原始数据类型,用于表示任意精度的整数。它可以很好地解决 JavaScript 处理大数字时的精度丢失问题。在使用 BigInt 类型时需要注意一些限制和注意事项,例如不能与普通数字类型混用、不能用于比较运算符中等。掌握 BigInt 类型的使用能够让我们更好地处理大数字相关的问题。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/651225ce95b1f8cacda91a58