二维码

JavaScript BigInt

JavaScript BigInt

JavaScript BigInt 变量用于存储太大而无法用普通 JavaScript 数字表示的大整数值。

JavaScript 整数精度

JavaScript 整数最多只能精确到 15 位:

整数精度

1
2
let x = 999999999999999;  
let y = 9999999999999999;

在 JavaScript 中,所有数字都以 64 位浮点格式(IEEE 754 标准)存储。

使用此标准,无法准确表示大整数,并且将四舍五入。

因此,JavaScript 只能安全地表示整数:

高达 9007199254740991 +(253-1)

低至 -9007199254740991 -(253-1).

超出此范围的整数值将失去精度。


如何创建 BigInt

要创建 BigInt,请将 n 附加到整数末尾或调用 BigInt()

1
2
let x = 9999999999999999;  
let y = 9999999999999999n;

1
2
let x = 1234567890123456789012345n;  
let y = BigInt(1234567890123456789012345)


BigInt:一种新的 JavaScript 数据类型

JavaScript a 是 “bigint”:typeof``BigInt

1
2
let x = BigInt(999999999999999);  
let type = typeof x;

BigInt 是 JavaScript 中的第二个数字数据类型(仅次于 Number)。

对于 BigInt,JavaScript 中支持的数据类型总数为 8 种:

  1. 字符串
    2.数字
    3.Bigint
    4.布尔值
    5.未定义
    6.空
    7.符号
    8.对象

BigInt 运算符

可用于 JavaScript Number 的运算符也可用于 BigInt

BigInt 乘法示例

1
2
3
let x = 9007199254740995n;  
let y = 9007199254740995n;
let z = x * y;

笔记

不允许 BigIntNumber 之间进行算术运算(类型转换会丢失信息)。

无符号右移 (>>>) 无法在 BigInt 上完成(它没有固定宽度)。


BigInt 小数

BigInt不能有小数。

BigInt Division 示例

1
2
3
4
5
6
let x = 5n;  
let y = x / 2;
// Error: Cannot mix BigInt and other types, use explicit conversion.

let x = 5n;
let y = Number(x) / 2;


BigInt 十六进制、八进制和二进制

BigInt也可以用十六进制、八进制或二进制表示法书写:

BigInt 十六进制示例

1
2
3
let hex = 0x20000000000003n;  
let oct = 0o400000000000000003n;
let bin = 0b100000000000000000000000000000000000000000000000000011n;


精准的好奇心

舍入可能会危及程序安全性:

:MAX_SAFE_INTEGER示例
1
9007199254740992 === 9007199254740993; // is true !!!


浏览器支持

BigInt自 2020 年 <> 月起,所有浏览器都支持:

Chrome 67 Edge 79 Firefox 68 Safari 14 Opera 54
May 2018 Jan 2020 Jul 2019 Sep 2020 Jun 2018

最小和最大安全整数

[ES6] 向 Number 对象添加了 maxmin 属性:

  • MAX_SAFE_INTEGER
  • MIN_SAFE_INTEGER
:MAX_SAFE_INTEGER示例
1
let x = Number.MAX_SAFE_INTEGER;

:MIN_SAFE_INTEGER示例
1
let x = Number.MIN_SAFE_INTEGER;


新的数字方法

[ES6] 还向 Number 对象添加了 2 个新方法:

  • Number.isInteger()
  • Number.isSafeInteger()

Number.isInteger() 方法

如果参数是整数,则 Number.isInteger() 方法返回 true

:isInteger()
1
2
Number.isInteger(10);  
Number.isInteger(10.5);


Number.isSafeInteger() 方法

安全整数是可以精确表示为双精度数字的整数。

如果参数是安全整数,则 Number.isSafeInteger() 方法返回 true

:isSafeInteger()
1
2
Number.isSafeInteger(10);  
Number.isSafeInteger(12345678901234567890);

安全整数是 -(253- 1) 至 +(253- 1).
这是安全的:9007199254740991。这是不安全的:9007199254740992。