原因
JavaScript 所有数字都保存成 64 位浮点数,这给数值的表示带来了两大限制。
- 一是数值的精度只能到 53 个二进制位(相当于 16 个十进制位),大于这个范围的整数,JavaScript 是无法精确表示,这使得 JavaScript 不适合进行科学和金融方面的精确计算。
- 二是大于或等于 2 的 1024 次方的数值,JavaScript 无法表示,会返回
Infinity。
// 超过 53 个二进制位的数值,无法保持精度
Math.pow(2, 53) === Math.pow(2, 53) + 1 // true
// 超过 2 的 1024 次方的数值,无法表示
Math.pow(2, 1024) // Infinity
概念
BigInt 只用来表示整数,没有位数的限制,任何位数的整数都可以精确表示。
使用
为了与 Number 类型区别,BigInt 类型的数据必须添加后缀n
123n // 十进制
0b1101n // 二进制
0o777n // 八进制
0xFFn // 十六进制
typeof运算符对于 BigInt 类型的数据返回bigint
typeof 123n // 'bigint'
注意
-
BigInt 与普通整数是两种值,它们之间并不相等。
42n === 42 // false -
BigInt 可以使用负号(
-),但是不能使用正号(+),因为会与 asm.js 冲突-42n // 正确 +42n // 报错
BigInt函数
- 转换规则基本与
Number()一致 BigInt函数必须有参数- 参数必须可以正常转为整数
BigInt 方法
BigInt.prototype.toString()
BigInt.prototype.valueOf()
BigInt.prototype.toLocaleString()
BigInt.asUintN(width, BigInt)
BigInt.asIntN(width, BigInt)
BigInt.parseInt(string[, radix])
转换规则
Boolean(0n) // false
Number(1n) // 1
String(1n) // "1"
数学运算
-
除法运算
/会舍去小数部分,返回一个整数。 -
不能使用右移位运算符
>>>和一元的求正运算符+ -
标准库函数的参数是 BigInt 就会报错
// 错误的写法 Math.sqrt(4n) // 报错 // 正确的写法 Math.sqrt(Number(4n)) // 2 -
| 0进行运算会报错1n | 0 // 报错
其他运算
0n < 1 // true
0n < true // true
0n == 0 // true
0n == false // true
0n === 0 // false
BigInt 与字符串混合运算时,会先转为字符串,再进行运算。
'' + 123n // "123"