JavaScript 需要 BigInt 是因为 Number 类型基于 IEEE 754 双精度浮点数,仅能安全表示 ≤2⁵³−1 的整数,超出则精度丢失;BigInt 提供任意精度整数运算,支持大整数精确计算,适用于金融、密码学、高精度时间戳等场景。
JavaScript 需要 BigInt 是因为标准的 Number 类型基于 IEEE 754 双
精度浮点数,只能安全表示最多 253 − 1(即 9007199254740991)以内的整数。超出这个范围后,整数会开始丢失精度——这不是“算错”,而是底层二进制表示的固有限制。
比如:
9007199254740991 + 1 === 9007199254740992 ✅ 正确9007199254740992 + 1 === 9007199254740992 ❌ 实际返回 true,因为 9007199254740993 已无法被精确表示
BigInt 用任意精度整数(arbitrary-precision integer)实现,能准确表达任意大(或小)的整数,只要内存允许。
n,如 123n、0n、-456n
BigInt("9007199254740991999999")(注意:必须传字符串,传大数字字面量会先被转成 Number 导致精度丢失)Number 混合运算:10n + 5 会抛出 TypeError;必须显式转换,如 10n + BigInt(5)
+、-、*、**、%、>>、 等,但不支持 / 的小数结果(除法只返回商的整数部分,向下取整)
Math 方法一起用(如 Math.pow(2n, 3n) 报错),需用 ** 运算符替代JSON.stringify()(会报错),需手动处理,例如:JSON.stringify({id: id.toString()})
"bigint",是独立的基本类型,和 "number" 不同10n == 10 返回 true(抽象相等),但 10n === 10 为 false(严格相等要求类型一致)Number.MAX_SAFE_INTEGER)