math.floor()用于向下取整,即返回小于或等于给定数的最大整数;对正数截断小数,对负数向更小整数舍入,如floor(3.9)=3.0、floor(-3.1)=-4.0。

Math.floor() 的作用很明确:返回小于或等于当前数值的最大整数,也就是“向下取整”。它不看小数部分是 0.1 还是 0.9,只要不是整数,就往更小的整数方向舍去。比如 Math.floor(3.9) 得 3.0,Math.floor(-3.1) 得 -4.0(因为 -4 比 -3.1 更小,且是满足 ≤ -3.1 的最大整数)。
floor 的实际用法和注意事项
它接收 double 或 float 类型参数,但**始终返回 double 类型值**,即使结果是整数(如 Math.floor(5) 返回 5.0)。如果要赋给 int 变量,必须显式强转:(int) Math.floor(x)。
- 正数向下取整就是直接截断小数:Math.floor(7.8) → 7.0
- 负数向下取整会变得更小:Math.floor(-7.2) → -8.0(不是 -7)
- 对整数本身无影响:Math.floor(0) → 0.0,Math.floor(-10) → -10.0
- 注意负零:Math.floor(-0.0) 返回 -0.0,虽然数值上等于 0.0,但二进制表示不同,单元测试中可能引发意外
floor 和 round 的核心区别在哪
两者目标完全不同:floor 是单向舍入(只往小走),round 是就近取整(带偏移逻辑)。round 的本质是先加 0.5 再 floor,即 Math.round(x) 等价于 (long) Math.floor(x + 0.5)(对 double)。
- 对 2.5:floor 直接得 2.0;round 是 2.5 + 0.5 = 3.0 → floor(3.0) = 3
- 对 -2.5:floor 得 -3.0;round 是 -2.5 + 0.5 = -2.0 → floor(-2.0) = -2
- 对 2.3:floor 和 round 都是 2(前者截断,后者加 0.5 后仍 floor 到 2)
- 对 -2.6:floor 是 -3.0;round 是 -2.6 + 0.5 = -2.1 → floor(-2.1) = -3
什么场景该选 floor 而不是 round
当你需要**保守截断、不向上溢出**时,floor 更可靠。比如:
- 计算分页总页数?错——该用 ceil((double)total / size)
- 库存扣减后取整数件数(不足一件不算)?对——用 floor(quantity)
- 坐标系统中确保对象不超出左边界(如 canvas 渲染位置)?常用 floor(x) 避免像素错位
- 做数据归一化时强制向下对齐(如每 10 分为一组,得分 27 归入第 2 组)?用 floor(27.0 / 10) → 2
真正要四舍五入且对负数也对称(如 -2.5 → -3),别依赖 round,改用 BigDecimal 配合 RoundingMode.HALF_UP。










