BigInt是JavaScript中专为精确表示任意大小整数设计的原生类型,用于解决Number类型在±9007199254740991外精度丢失的问题;通过字面量(如123n)或BigInt()构造函数(推荐传字符串)创建,支持整数运算但不与Number混用,适用于超大ID、密码学、金融整数等高精度场景。

JavaScript 中存储超过安全整数范围的数据,主要靠 BigInt 类型,它专为精确表示任意大小的整数而设计。普通 Number 类型在 ±9007199254740991(即 Number.MAX_SAFE_INTEGER)之外就无法保证精度,而 BigInt 完全绕开浮点限制,用任意位数的二进制整数存储值。
BigInt 的两种创建方式
必须显式声明,不能隐式转换:
-
字面量写法:在整数字面量末尾加小写
n,例如9007199254740992n、0n、-123n;注意不能写成91.0n或1e5n,BigInt 只接受整数形式 -
构造函数写法:
BigInt("9007199254740992")—— 强烈推荐传字符串,避免大数字字面量在解析前就被 JS 当作Number截断或失真;传数字仅限安全范围内的整数,如BigInt(123)合法,但BigInt(9007199254740992)已经不准了
为什么不能直接用 Number 或字符串代替
各方案有明确适用边界:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
-
Number类型:超出MAX_SAFE_INTEGER后,9007199254740992 === 9007199254740993返回true,计算结果不可信 - 字符串:适合存储和传输(比如 ID、哈希),但无法直接参与数学运算,需先转 BigInt 才能加减乘除
- BigInt:唯一支持高精度整数运算的原生类型,支持
+、-、*、**、%和严格相等===,但不支持与Number混算(1n + 2报错)
实际使用中的关键细节
避开常见坑,才能稳定用好 BigInt:
立即学习“Java免费学习笔记(深入)”;
- 比较时注意类型:
1n === 1是false;1n > 0会报错,必须写成1n > 0n - JSON 序列化不支持:直接
JSON.stringify({id: 123n})会抛错,需手动转字符串,例如JSON.stringify({id: 123n.toString()}) - 输出展示友好:
console.log(123n)自动调用.toString(),但拼接字符串时要显式转换,如"ID: " + 123n.toString() - 除法特殊处理:
5n / 2n得2n(向零截断),不是2.5;如需小数结果,得先转Number再算,但会丢失精度
典型适用场景
不是所有大数都需要 BigInt,选对场景更重要:
- 后端返回的超长整数 ID(如 Snowflake、MongoDB ObjectId 转整数)
- 密码学运算(模幂、大素数生成)、区块链地址计算
- 金融系统中以“最小货币单位”(如分、 Satoshi)计数的整数金额
- 科学计算中需保持整数精度的累加、统计、索引(如天文数据行号)

















