本题难度:⭐
答:BigInt 是 JS 的一种基本数据结构,类似于 Number 类型。用来精确(安全)地表示、存储和计算大整数。
mdn:
BigInt
是一种内置对象,它提供了一种方法来表示大于2^53 - 1
的整数。这原本是 Javascript中可以用Number
表示的最大数字。BigInt
可以表示任意大的整数。
可以用在一个整数字面量后面加 n
的方式定义一个 BigInt
,或者调用函数BigInt()
。
const num = 10
const num1 = 10n
const num2 = BigInt(10)
num1 === num2 // true
num1 == num // true
num1 === num // false
typeof num // number
typeof num1 // bigint
以下操作符可以和 BigInt
一起使用: +
、-
、*
、/
、**
、%
。除 >>>
(无符号右移)之外的 位操作 也可以支持。因为 BigInt
都是有符号的, >>>
(无符号右移)不能用于 BigInt
。
关于位运算不懂的可以看我的这篇文章:为了看懂 Vue3 diff算法,我学习了JS 位运算
const num = 32n
const num1 = num + 1 // 报错 Uncaught TypeError: Cannot mix BigInt and other types, use explicit conversions
const num2 = num + 1n // 33n
const num3 = num - 1n // 31n
const num4 = num * 1n // 64n
const num5 = num / 2n // 32n
const num6 = num ** 2n // 1024n **运算符相当于 Math.pow
const num7 = num % 30n // 2n
-
直观表示大整数
-
安全地存储和计算大整数
当输入一个比较长的数字时,JS 总是将其转换为科学计数,即使调用 toString() 方法,也无法获得它表示的真实数字。
用 BigInt 可以解决这个问题,正确地显示输入的数字,如下图,
调用 toString() 方法,依旧能够获得期望的数值,如下图,
JS 中,规定了语言所能够保证“安全”地进行计算的最大整数是Number.MAX_SAFE_INTEGER
,也就是 2^53 - 1 (9007199254740991),超过了这个数值,计算就可能产生一些问题,比如,
用 BigInt 可以解决这个问题,正确地计算。
以前没有 BigInt 的时候,大整数相加是如何实现的呢?
思路是像小学学习加法时一样,在草稿本上画个类似这样的图,逢10进1做加法计算,然后处理一些边界问题。
function add(a, b) {
let i = a.length - 1;
let j = b.length - 1;
let carry = 0; // 存储进位
let ret = '';
while (i >= 0 || j >= 0) {
let x = 0;
let y = 0;
let sum;
if (i >= 0) {
x = a[i] - '0';
i --;
}
if (j >= 0) {
y = b[j] - '0';
j --;
}
sum = x + y + carry; // 加上进位
if (sum >= 10) { // 逢 10 进 1
carry = 1;
sum -= 10;
} else {
carry = 0;
}
// 0 + ''
ret = sum + ret;
}
if (carry) {
ret = carry + ret;
}
return ret;
}
add('999999999999999999999999', '1') // '1000000000000000000000000'
以前还要封装函数来实现大整数运算,现在只需要调 BigInt 就行了,真方便。
BigInt 可以精确地表示、存储和计算长整数。
我相信 JS 会越来越好,以后也能解决类似 0.1 + 0.2 !== 0.3 的精度问题的!
这是阿林持续更文的第29天,输出洞见技术,再会~
下一篇: