JavaScript 中 Number 类型中数值溢出时的表现行为

作者:袖梨 2026-07-09
JavaScript中Number类型溢出时返回Infinity或-Infinity,下溢归零为0或-0,精度丢失发生在超过Number.MAX_SAFE_INTEGER时,可用isFinite、Number.isNaN及BigInt应对。

JavaScript 中 Number 类型发生数值溢出时,不会报错,而是返回特殊值 Infinity-Infinity,这是 IEEE 754 标准定义的行为,属于静默处理。

溢出(Overflow):超出最大可表示值

当运算结果大于 Number.MAX_VALUE(约 1.7976931348623157e+308)时,结果变为 Infinity;若为负向溢出(小于 -Number.MAX_VALUE),则为 -Infinity

  • Number.MAX_VALUE * 2Infinity
  • -Number.MAX_VALUE * 2-Infinity
  • 1 / 0Infinity-1 / 0-Infinity
  • 任何非零有限数与 Infinity 进行常规算术运算(如加、减、乘、除),结果仍为 Infinity(符号依规则保留)
  • Infinity / InfinityInfinity - Infinity 等未定义运算 → NaN

下溢(Underflow):趋近于零但低于最小正数

当正数运算结果小于 Number.MIN_VALUE(约 5e-324)时,JS 将其“归零”,返回 0;负数下溢则返回 -0

  • Number.MIN_VALUE / 20
  • -Number.MIN_VALUE / 2-0
  • 0-0=== 下相等,但在除法中表现不同:1 / 0 === Infinity,而 1 / -0 === -Infinity

安全整数边界:精度丢失而非溢出

注意区分“溢出”和“精度丢失”。JS 的 最大安全整数Number.MAX_SAFE_INTEGER2^53 - 1 = 9007199254740991)。超过此范围的整数仍能存储,但无法保证精确表示:

立即学习“Java免费学习笔记(深入)”;

  • 9007199254740991 + 19007199254740992(正确)
  • 9007199254740991 + 29007199254740992(丢失精度,+2 变成 +1)
  • 这种现象不是 Infinity,而是浮点表示局限导致的隐式舍入

如何检测和应对

可用内置函数主动识别极端值:

  • isFinite(x):仅当 x 是普通数字(非 NaN、非 ±Infinity)时返回 true
  • isNaN(x):判断是否为 NaN(注意 isNaN("abc") 会先转数字,推荐用 Number.isNaN(x) 更严格)
  • 对大整数运算,应避免直接使用 Number,改用 BigInt(需字面量加 n 后缀)或第三方库如 big.js

相关文章

精彩推荐