js 的 BigInt 和 Number 类型有什么区别?

文章类型:Javascript

发布者:hp

发布时间:2025-02-22

一:概述

BigInt是ES6之后引入的,用来表示大于2^53-1的整数,而Number是传统的数值类型,包括整数和浮点数。

首先,存储范围应该是一个区别,Number的最大安全整数是2^53-1,而BigInt可以表示更大的整数,没有上限

二:类别

(1)类型标识上

       ‌BigInt‌=>typeof 123n → "bigint"

       ‌Number‌=>typeof 123 → "number"

(2)数值范围上

         ‌BigInt‌=>无上限(任意精度整数)

          Number‌=>±(2^53 - 1)

(3)字面量写法上

‌          BigInt‌=>以 n 结尾(如 123n)

          Number‌=>普通数字(如 123、3.14)

(4)JSON序列化上

          BigInt‌=>需手动转换

          Number‌=>原生支持

(5)数学运算兼容性

          BigInt‌=>不可与Number婚后运算

          Number‌=>通用

(6)全局方法支持

          BigInt‌=>不支持Math

          Number‌=>支持

三:原理

1:BigInt‌ 在内存中以类似字符串的“分段”方式存储,避免溢出

2:‌Number‌ 的 64 位双精度浮点格式中,1 位符号位 + 11 位指数 + 52 位尾数,导致大整数精度丢失

四:场景

1:BigInt‌适用于超出Number安全整数范围的计算

2:Number适用于常规数值计算

五:代码

// 大数计算(Number 溢出)
const maxSafe = 9007199254740991;
console.log(maxSafe + 2); // → 9007199254740992(精度错误)

// BigInt 正确处理
const bigIntVal = 9007199254740991n;
console.log(bigIntVal + 2n); // → 9007199254740993n(精确)

//除法
5n / 2n → 2n  // 舍弃小数(返回整数)
5 / 2 → 2.5   // 保留小数

//比较

10n == 10  → true  // 宽松相等
10n === 10 → false // 严格类型不等

//类型转换
Number(9007199254740993n) → 9007199254740992  // 精度丢失
BigInt(1.5) → 报错(仅支持整数)

六:总结

1:BigInt适用于超大整数,Number适用于常规数值

2:BigInt 为任意精度整数,Number 为双精度浮点数