取整函数是什么
CEIL 向数轴正方向取整(天花板),FLOOR 向负方向取整(地板),两者在负数上的表现最容易被误判。CEILING 与 CEIL 等价,MySQL 与 PostgreSQL 都支持。分页总页数、资源规格向上取整是最常见的两个使用场景。
基本信息
| CEIL(x) | 不小于 x 的最小整数,别名 CEILING |
|---|---|
| FLOOR(x) | 不大于 x 的最大整数 |
| 负数 | CEIL(-1.5) 得 -1,FLOOR(-1.5) 得 -2,按数轴方向取整 |
| 返回类型 | PostgreSQL 保留 numeric 等类型;MySQL 视参数类型返回整数或小数 |
| 典型用途 | 总页数、并发规格、按整箱整柜折算数量 |
| 与 ROUND 区别 | ROUND 是四舍五入,方向取决于数值大小 |
基础用法
基础用法
SELECT CEIL(1.2), FLOOR(1.8); -- 2, 1
SELECT CEIL(-1.5), FLOOR(-1.5); -- -1, -2:按数轴方向取整
-- 分页总页数:向上取整,除法先保证是小数
SELECT CEIL(COUNT(*) / 20.0) AS pages FROM orders;
-- 按整箱折算:不足一箱也算一箱
SELECT CEIL(qty / 12.0) AS boxes FROM order_items;与截断的区别
与截断的区别
-- TRUNCATE 是向零截断,与 FLOOR、CEIL 都不等价
SELECT TRUNCATE(1.9, 0), TRUNCATE(-1.9, 0); -- 1, -1:都朝零靠
-- PostgreSQL 里这个函数叫 trunc
SELECT trunc(1.9), trunc(-1.9); -- 1, -1
-- 想保留小数位时用 trunc 的第二参数
SELECT trunc(3.14159, 2); -- 3.14取整方式对比
| 函数 | 1.5 | -1.5 | 取整方向 |
|---|---|---|---|
| CEIL | 2 | -1 | 向正无穷 |
| FLOOR | 1 | -2 | 向负无穷 |
| ROUND | 2 | -2 | 四舍五入 |
| TRUNCATE / trunc | 1 | -1 | 向零靠 |
| CAST 为整数 | 2 | -2 | MySQL 会舍入,不要当截断用 |
| 负数分页场景 | — | — | 页数必须是非负数,先保证计数不为负 |
典型使用场景
- 分页:向上取整算出总页数
- 资源规格:申请内存、CPU 按固定档位向上取整
- 计价:不足一个计费单位按一个算
- 分箱装箱:按整箱数量向上取整
- 图表分桶:把指标按固定步长向下取整成桶
- 时间对齐:把秒数按 5 分钟步长向下对齐
- 批次切分:按每批固定条数向上取整,预估需要跑多少批
- 容量估算:把字节数向上取整换算成 MB 或 GB 展示
跨库做整数除法要小心:PostgreSQL 里 CEIL(5/2) 会先算整数除法得 2,再取整仍是 2;MySQL 的 5/2 得到 2.5,CEIL 之后是 3。想要小数结果就先乘 1.0 或显式转 numeric。
CEIL 与 FLOOR 常和分组配合做分桶:把数值除以步长再向下取整再乘回步长,就能得到以步长为宽度的区间起点,例如按 100 一档统计订单金额分布。
负数区间里把 FLOOR 当“取小”用容易与业务直觉相反:温度、盈亏这类可能为负的指标,取整前先明确需求是向数轴取整还是取绝对值再取整。