Math.ceil向正无穷取整、Math.floor向负无穷取整:ceil(-2.9)→-2,floor(-2.1)→-3;二者均非四舍五入,且对浮点误差敏感,需精度校准或改用trunc/整数运算。

Math.ceil 和 Math.floor 的基本行为差异
Math.ceil 总是向正无穷方向取整,Math.floor 总是向负无穷方向取整。这不是“四舍五入”,也不是“去掉小数”,而是严格按数学定义:对正数,Math.ceil(2.1) → 3,Math.floor(2.9) → 2;对负数,Math.ceil(-2.9) → -2(比 -2.9 大的最小整数),Math.floor(-2.1) → -3(比 -2.1 小的最大整数)。
常见误用场景:想取整却得到意外结果
典型错误是把 Math.ceil 当作“进一法”用于金额计算,但没处理浮点误差。比如 Math.ceil(0.1 + 0.2) 得到 1,看似正常,但实际 0.1 + 0.2 === 0.30000000000000004,所以 Math.ceil(0.1 + 0.2) 其实是 Math.ceil(0.30000000000000004) → 1,而你可能期望它仍是 0 或 1 取决于业务逻辑。这时候必须先做精度校准:
- 用
Number((a + b).toFixed(10))固定小数位再取整 - 或改用整数运算:把元换算成分,
Math.ceil((10 + 20) / 10)→ 更可靠 - 注意:
Math.ceil(null)返回0,Math.ceil(undefined)返回NaN,务必检查输入类型
替代方案:何时不该用 Math.ceil / Math.floor
当目标是“四舍五入到整数”,直接用 Math.round 更合适;当需要“截断小数部分”(即向零取整),应选 Math.trunc 或 a 。例如:
Math.trunc(-2.9) // → -2 Math.floor(-2.9) // → -3 Math.ceil(-2.9) // → -2
另外,Math.ceil 在分页计算中常被误用:Math.ceil(total / pageSize) 是正确总页数,但如果 total 是字符串(如 "10"),会隐式转成数字;若含非数字字符(如 "10px"),结果为 NaN —— 必须提前 parseInt 或 parseFloat 并校验有效性。
性能与兼容性提醒
Math.ceil 和 Math.floor 是原生方法,现代 JS 引擎优化充分,无需担心性能。但要注意:Math.trunc 不支持 IE,而 Math.ceil/Math.floor 自 ES1 起就存在,所有环境都可用。如果项目需兼容老旧环境且逻辑依赖“向零取整”,别用 Math.trunc 替代 Math.ceil/Math.floor 组合,否则语义错乱。

















