BigInt能彻底避免大整数精度丢失,前提是必须用字符串初始化、禁止与Number混用、运算比较需类型一致、JSON序列化需手动转字符串。

JavaScript 中的 BigInt 是专门用来安全处理任意精度整数的类型,它能彻底避免大整数运算中的精度丢失问题——前提是必须正确使用,不能和普通数字(Number)混用。
BigInt 的基本用法和创建方式
BigInt 通过在整数字面量末尾加 n 创建,或者调用 BigInt() 构造函数:
-
1234567890123456789012345678901234567890n(字面量写法,最常用) -
BigInt("1234567890123456789012345678901234567890")(字符串入参,安全;传 Number 可能已失真) -
BigInt(100)(仅限小整数,且不推荐用 Number 入参,因为 Number 本身可能已不精确)
注意:BigInt(9007199254740992.5) 会报错,BigInt 只接受整数输入;传字符串是最稳妥的方式。
BigInt 运算规则和注意事项
BigInt 支持常见的算术运算(+ - * / % **),但有几条硬性限制:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
- 不能和
Number类型直接运算,如100n + 1会抛出TypeError - 比较操作符(
===, ==, >, <)可以跨类型比较数值大小(100n === 100为 false,但100n == 100为 true;100n > 99为 true) - 位运算符(
& | ^ << >> >>>)支持,但>>>(无符号右移)在 BigInt 上行为与 Number 不同,需留意 - 不能用于 Math 方法(如
Math.pow)、日期、JSON 序列化(JSON.stringify(100n)报错)
如何避免精度丢失的关键实践
精度丢失通常发生在两个环节:初始化阶段和混合运算阶段。规避方法很明确:
- 从源头用字符串构造 BigInt,尤其当数字来自 API、用户输入或超大常量时:
BigInt("900719925474099199999999999999") - 确保整个计算链路只用 BigInt:如果中间某步转成 Number(比如
Number(100n)),就可能丢失精度 - 需要 JSON 传输时,手动转换为字符串:
JSON.stringify({ value: myBigNum.toString() }),接收端再BigInt(str) - 做除法时注意结果是 BigInt(向下取整),余数用
%,若需小数结果,应转为字符串自行实现高精度小数逻辑(BigInt 本身不支持小数)
和 Number 的边界与协作场景
Number 安全整数范围是 -(2^53 - 1) 到 2^53 - 1(即 ±9007199254740991)。超出此范围的整数,Number 就无法精确表示:
- 例如:
9007199254740992 + 1在 Number 中仍等于9007199254740992(已失真) - 而
9007199254740992n + 1n精确得9007199254740993n - 日常开发中,ID、时间戳(毫秒级长整型)、密码学计算、金融大额整数等,只要可能突破
2^53,就该默认用 BigInt
不复杂但容易忽略:只要涉及大整数,就别碰 Number —— 从读取、存储到运算,全程保持 BigInt 类型纯净。

















