2021.04.24(BigInt 数据类型)

JavaScript 所有数字都保存成 64 位浮点数,这给数值的表示带来了两大限制。一是数值的精度只
能到 53 个二进制位(相当于 16 个十进制位),大于这个范围的整数,JavaScript 是无法精确表
示的,这使得 JavaScript 不适合进行科学和金融方面的精确计算。二是大于或等于2的1024次方的
数值,JavaScript 无法表示,会返回 Infinity  。

1.  // 超过 53 个二进制位的数值,无法保持精度
2.  Math.pow(2, 53) === Math.pow(2, 53) + 1 // true
3.
4.  // 超过 2 的 1024 次方的数值,无法表示
5.  Math.pow(2, 1024) // Infinity

ES2020 引入了一种新的数据类型 BigInt(大整数),来解决这个问题。BigInt 只用来表示整
数,没有位数的限制,任何位数的整数都可以精确表示。

1.  const a = 2172141653n;
2.  const b = 15346349309n;
3.
4.  // BigInt 可以保持精度
5.  a * b // 33334444555566667777n
6.
7.  // 普通整数无法保持精度
8.  Number(a) * Number(b) // 33334444555566670000

为了与 Number 类型区别,BigInt 类型的数据必须添加后缀 n  。

1.  1234 // 普通整数
2.  1234n // BigInt
3.
4.  // BigInt 的运算
5.  1n + 2n // 3n

BigInt 与普通整数是两种值,它们之间并不相等。

1.  42n === 42 // false

typeof  运算符对于 BigInt 类型的数据返回 bigint  。

1.  typeof 123n // 'bigint'

BigInt 可以使用负号( -  ),但是不能使用正号( +  ),因为会与 asm.js 冲突。

1.  -42n // 正确
2.  +42n // 报错

JavaScript 以前不能计算70的阶乘(即 70!  ),因为超出了可以表示的精度。

1.  let p = 1;
2.  for (let i = 1; i <= 70; i++) {
3.  p *= i;
4.  }
5.  console.log(p); // 1.197857166996989e+100

可以使用 Boolean()  、 Number()  和 String()  这三个方法,将 BigInt 可以转为布尔值、数
值和字符串类型。

1.  Boolean(0n) // false
2.  Boolean(1n) // true
3.  Number(1n) // 1
4.  String(1n) // "1"

上面代码中,注意最后一个例子,转为字符串时后缀 n  会消失。


另外,取反运算符( !  )也可以将 BigInt 转为布尔值。

1.  !0n // true
2.  !1n // false
posted @ 2021-04-25 17:24  铁打的代码流水的bug  阅读(332)  评论(0)    收藏  举报