JavaScript 的 Number 类型基于 IEEE 754 双精度浮点格式,最大安全整数为 Number.MAX_SAFE_INTEGER(9007199254740991),超出此范围的整数在转换为 Number 时即发生精度丢失;BigInt 构造函数若接收已失真的 Number,无法恢复原始值,必须传入字符串才能保证精确性。
javascript 的 `number` 类型基于 ieee 754 双精度浮点格式,最大安全整数为 `number.max_safe_integer`(9007199254740991),超出此范围的整数在转换为 `number` 时即发生精度丢失;`bigint` 构造函数若接收已失真的 `number`,无法恢复原始值,必须传入字符串才能保证精确性。
当你执行 BigInt(9223372036854775807) 时,看似传递的是一个“精确的大整数”,但实际上——该字面量在被 JavaScript 解析为 Number 类型的瞬间,就已经丢失了精度。
原因在于:9223372036854775807 超过了 Number.MAX_SAFE_INTEGER(9007199254740991),因此 JavaScript 引擎无法用 Number 精确表示它。我们可以通过以下代码验证:
console.log(9223372036854775807); // 输出:9223372036854776000(已四舍五入!)console.log(Number.MAX_SAFE_INTEGER); // 9007199254740991console.log(9223372036854775807 === 9223372036854776000); // true
可见,9223372036854775807 这个字面量在 JS 中根本无法以 Number 形式精确存在——它被自动近似为 9223372036854776000。而 BigInt(9223372036854775807) 实际上等价于 BigInt(9223372036854776000),最终得到 9223372036854775808n(注意:BigInt 对 Number 输入会先转为整数,再构造,但此时输入本身已是错误值)。
✅ 正确做法:始终用字符串初始化 BigInt,绕过 Number 的精度瓶颈:
立即学习“Java免费学习笔记(深入)”;
console.log(BigInt("9223372036854775807")); // 9223372036854775807n ✅console.log(BigInt("9007199254740991") === 9007199254740991n); // trueconsole.log(BigInt("123456789012345678901234567890")); // 精确大整数
⚠️ 注意事项:
总结:BigInt 的设计目标是提供任意精度整数运算,但它不负责修复上游 Number 的精度缺陷。要确保精度,必须从源头阻断 Number 解析——即用字符串字面量创建 BigInt。这是 JavaScript 类型系统限制下的必选实践,而非 API 使用错误。