bigint与number不能自动互转,必须显式转换;bigint转number用number()但仅在±2⁵³−1内安全,超限会精度丢失或抛rangeerror;number转bigint用bigint()只接受整数,小数截断,nan/infinity报typeerror。

BigInt 与 Number 不能自动互转,必须显式转换,且需注意精度丢失和范围限制。
BigInt 转 Number
使用 Number() 函数可将 BigInt 转为 Number,但仅当值在 Number.MIN_SAFE_INTEGER 到 Number.MAX_SAFE_INTEGER(即 ±2⁵³−1)范围内才安全。超出时会丢失精度或抛出 RangeError(取决于引擎实现,Chrome 报错,Firefox 返回 Infinity 或错误值)。
-
Number(100n)→100 -
Number(9007199254740992n)→9007199254740992(刚好是2⁵³,仍属安全整数边界内) -
Number(9007199254740993n)→9007199254740992(已丢失精度) -
Number(10n ** 100n)→ 在 Chrome 中抛出RangeError;Firefox 可能返回Infinity
Number 转 BigInt
使用 BigInt() 构造函数,但只接受**整数值**(小数会被截断),且不能传入 NaN、Infinity 或非数字字符串。
-
BigInt(123)→123n -
BigInt(123.9)→123n(小数部分直接丢弃,不四舍五入) -
BigInt(NaN)或BigInt(Infinity)→ 抛出TypeError -
BigInt("123")→123n(支持十进制字符串) -
BigInt("0xFF")→255n(也支持十六进制等带前缀的字符串)
安全互转的实用建议
避免隐式混合运算,显式检查再转换:
- 转 Number 前先用
BigInt.asIntN(64, value) === value粗略判断是否在安全整数范围内(不够精确,仅作参考) - 更可靠的做法:用
value = Number.MIN_SAFE_INTEGER(注意比较时两边都应为 BigInt 或都转 Number) - 若需保留大整数精度,尽量全程使用 BigInt,避免转回 Number
- 从用户输入或 API 获取数字时,优先用
BigInt(String(value))而非BigInt(Number(value)),防止 Number 解析阶段就丢失精度(如超长数字字符串)
不复杂但容易忽略细节,关键在于理解两者的表示本质不同:Number 是双精度浮点,BigInt 是任意精度整数。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











