JavaScript数值取整有三种本质不同的方法:Math.floor向下取整(向负无穷),Math.ceil向上取整(向正无穷),位运算(如|0)向零截断;三者语义、适用场景及负数行为均不同,不可混用。

JavaScript 中数值取整有明确语义和不同用途的方法,Math.floor 和 Math.ceil 是方向性取整,而位运算(如 | 0、~~)是向零截断,三者行为本质不同,不能混用。
Math.floor:向下取整(向负无穷)
返回小于或等于原数的最大整数。对正数是“舍去小数”,对负数则是“更远离零”:
-
Math.floor(4.9)→ 4 -
Math.floor(-4.9)→ -5(因为 -5 < -4.9,且是满足条件的最大整数) - 常用于分页总页数计算:比如 23 条数据、每页 10 条,
Math.ceil(23 / 10)才对;若误用Math.floor(23 / 10)得到 2,会漏掉第 3 页
Math.ceil:向上取整(向正无穷)
返回大于或等于原数的最小整数。对正数是“进一位”,对负数则是“更靠近零”:
-
Math.ceil(4.1)→ 5 -
Math.ceil(-4.1)→ -4(因为 -4 > -4.1,且是满足条件的最小整数) - 适合计费场景:例如按分钟计费,通话 1.2 分钟按 2 分钟算,就该用
Math.ceil(1.2)
位运算取整:向零截断(非四舍五入)
包括 | 0、~~x、x ^ 0、x << 0 等,本质是将操作数转为 32 位有符号整数,直接丢弃小数部分:
-
12.9 | 0→ 12 -
-12.9 | 0→ -12(不是 -13) - 仅支持数值在 [-2³¹, 2³¹−1] 范围内,超出会溢出或产生意外结果
- 性能快,但可读性差;现代代码中更推荐语义清晰的
Math.trunc()替代
别混淆:Math.round 不等于 Math.ceil 或 Math.floor
Math.round() 是四舍五入,规则是小数部分 ≥ 0.5 向上,否则向下:
-
Math.round(2.5)→ 3 -
Math.round(-2.5)→ -2(注意:JS 中Math.round对负数 .5 的处理是“向零舍入”,即 -2.5 → -2) - 它不保证“向上”或“向下”,也不等价于
Math.floor(x + 0.5)(后者在负数时会出错)


















