JavaScript 大整型


目录

    显示目录

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

JavaScript 整数精度

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

整数精度

let x = 999999999999999;
let y = 9999999999999999;

自己尝试一下→

<!DOCTYPE html>
<html>
<body>

<h1>JavaScript Numbers</h1>
<h2>Integer Precision</h2>

<p>Integers (numbers without a period or exponent notation) are accurate up to 15 digits:</p>

<p id="demo"></p>

<script>
let x = 999999999999999;
let y = 9999999999999999;
document.getElementById("demo").innerHTML = x + "<br>" + y;
</script>

</body>
</html>


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

在这个标准下,大整数无法精确表示,将会被四舍五入。

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

最多 9007199254740991 +(253-1)

降至 -9007199254740991 -(253-1)。

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


如何创建 BigInt

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

例子

let x = 9999999999999999;
let y = 9999999999999999n;

自己尝试一下 →

<!DOCTYPE html>
<html>
<body>

<h1>JavaScript Numbers</h1>
<h2>Integer and BigInt</h2>

<p id="demo"></p>

<script>
let x = 9999999999999999;
let y = BigInt("9999999999999999");
document.getElementById("demo").innerHTML = x + "<br>" + y;
</script>

</body>
</html>


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

自己尝试一下→

<!DOCTYPE html>
<html>
<body>

<h1>JavaScript Numbers</h1>
<h2>Create a BigInt</h2>

<p id="demo"></p>

<script>
let x = 123456789012345678901234567890n;
let y = BigInt("123456789012345678901234567890");
document.getElementById("demo").innerHTML = x + "<br>" + y;
</script>

</body>
</html>



BigInt:一种新的 JavaScript 数据类型

JavaScript typeof BigInt 是“bigint”:

例子

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

自己尝试一下→

<!DOCTYPE html>
<html>
<body>

<h1>JavaScript Numbers</h1>
<h2>BigInt typeof</h2>

<p>The typeof a BigInt is:</p>
<p id="demo"></p>

<script>
let x = BigInt("9999999999999999");
document.getElementById("demo").innerHTML = typeof x;
</script>

</body>
</html>


BigInt 是 JavaScript 中的第二种数字数据类型 (在数字之后)。

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

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


BigInt 运算符

可用于 JavaScript Number 的运算符 也可以在 BigInt 上使用。

BigInt 乘法示例

let x = 9007199254740995n;
let y = 9007199254740995n;
let z = x * y;

自己尝试一下→

<!DOCTYPE html>
<html>
<body>

<h1>JavScript Bigint</h1>
<h2>BigInt Multiply</h2>
<p>Operators that can be used a Number can be used on a BigInt.</p>
<p id="demo"></p>

<script>
let x = 9007199254740995n;
let y = 9007199254740995n;
let z = x * y;

document.getElementById("demo").innerHTML = z; 
</script>

</body>
</html>

笔记

BigInt 之间的算术 并且不允许使用 Number (类型转换会丢失信息)。

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


BigInt 小数

BigInt 不能有小数。

BigInt 除法示例

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;

自己尝试一下→

<!DOCTYPE html>
<html>
<body>

<h1>JavScript Bigint</h1>
<h2>BigInt Divide</h2>

<p>A BigInt can not have decimals.</p>
<p>Cannot mix BigInt and other types, use explicit conversions.</p>
<p id="demo"></p>

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

document.getElementById("demo").innerHTML = y; 
</script>

</body>
</html>

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

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

BigInt 十六进制示例

let hex = 0x20000000000003n;
let oct = 0o400000000000000003n;
let bin = 0b100000000000000000000000000000000000000000000000000011n;

自己尝试一下 →

<!DOCTYPE html>
<html>
<body>

<h1>JavScript Bigint</h1>
<h2>Hex, Octal and Binary</h2>

<p id="demo"></p>


<script>
let hex = 0x20000000000003n;
let oct = 0o400000000000000003n;
let bin = 0b100000000000000000000000000000000000000000000000000011n;

document.getElementById("demo").innerHTML = hex + "<br>" + oct + "<br>" + bin; 
</script>

</body>
</html>

精准好奇心

舍入可能会损害程序安全性:

MAX_SAFE_INTEGER 示例

9007199254740992 === 9007199254740993; // is true !!!

自己尝试一下→

<!DOCTYPE html>
<html>
<body>

<h1>JavScript Numbers</h1>
<h2>Integer Precision</h2>

<p>Is 9007199254740992 equal to 9007199254740993?</p>

<p id="demo"></p>


<script>
let x = 9007199254740992 === 9007199254740993;
document.getElementById("demo").innerHTML = x;
</script>

</body>
</html>

浏览器支持

自 2020 年 9 月起,所有浏览器均支持 BigInt

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


最小和最大安全整数

ES6 向 Number 对象添加了 max 和 min 属性:

  • MAX_SAFE_INTEGER

  • MIN_SAFE_INTEGER

MAX_SAFE_INTEGER 示例

let x = Number.MAX_SAFE_INTEGER;

自己尝试一下→

<!DOCTYPE html>
<html>
<body>

<h2>Number Object Properties</h2>

<p>MAX_SAFE_INTEGER</p>

<p id="demo"></p>

<script>
let  x = Number.MAX_SAFE_INTEGER;
document.getElementById("demo").innerHTML = x;
</script>

</body>
</html>

MIN_SAFE_INTEGER 示例

let x = Number.MIN_SAFE_INTEGER;

自己尝试一下→

<!DOCTYPE html>
<html>
<body>

<h2>Number Object Properties</h2>

<p>MIN_SAFE_INTEGER</p>

<p id="demo"></p>

<script>
let  x = Number.MIN_SAFE_INTEGER;
document.getElementById("demo").innerHTML = x;
</script>

</body>
</html>

新的数字方法

ES6 还为 Number 对象添加了 2 个新方法:

  • Number.isInteger()

  • Number.isSafeInteger()


Number.isInteger() 方法

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

示例:isInteger()

Number.isInteger(10);
Number.isInteger(10.5);

自己尝试一下 →

<!DOCTYPE html>
<html>
<body>

<h1>JavaScript Numbers</h1>
<h2>The isInteger() Method</h2>

<p>The isInteger() method returns true if the argument is an integer.</p>
<p>Otherwise it returns false.</p>

<p id="demo"></p>

<script>
document.getElementById("demo").innerHTML =
Number.isInteger(10) + "<br>" + Number.isInteger(10.5);
</script>

</body>
</html>

Number.isSafeInteger() 方法

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

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

示例 isSafeInteger()

Number.isSafeInteger(10);
Number.isSafeInteger(12345678901234567890);

自己尝试一下→

<!DOCTYPE html>
<html>
<body>

<h1>JavaScript Numbers</h1>
<h2>The isSafeInteger() Method</h2>

<p>The isSafeInteger() method returns true if the argument is a safe integer.</p>
<p>Otherwise it returns false.</p>

<p id="demo"></p>

<script>
document.getElementById("demo").innerHTML =
Number.isSafeInteger(10) + "<br>" + Number.isSafeInteger(12345678901234567890);
</script>

</body>
</html>

安全整数是从 -(253 - 1) 到 +(253 - 1) 的所有整数。
这是安全的:9007199254740991。这是不安全的:9007199254740992。