超越双精度的BigInt

980 阅读1分钟

在JavaScript中,Number类型可以表达的最大数字是2^53,这是 IEEE754 数值的固有缺陷,其中最经典的问题莫过于

0.1 + 02 != 0.3; // true,0.1+0.2的结果为0.30000000000000004

JavaScript提供了一种新的数据类型 BigInt 表达比2^53大的所有数字。

语法

BigInt(value); // value可以是字符串或数值

注意: BigInt() 不是构造函数,因此不能使用 new 操作符。

可以这样定义一个 BigInt 类型数据

let x1 = 10n; // 在整数字面量后面加 n
let x2 = BigInt(123456);
let x3 = BigInt('438223');

需要注意的是:

1、BigInt 类型不能使用 Math 对象的方法

2、BigInt 类型不能和 Number 类型混合运算

运算

BigInt 可以正常使用: +*-**%

BigInt 不能正常使用:/ 。该操作符会导致向零取整,也就是说不会返回小数部分。

10n / 2n; // 5n
5n / 2n; // 2n

比较

BigInt 和 Number 宽松相等

0n ==== 0; // false
0n == 0; // true

BigInt 和 Number 之间可以正常使用比较符:><>=<= 。因此二者可以混入数组进行排序。

条件

BigInt 作为条件使用时类型 Number

if (0n) {
  console.log(0)
} else {
  console.log(1)
}

兼容性

虽然 BigInt 很强,但是目前的兼容性还很差

更多兼容性问题查看 caniuse.com/#search=Big…