round四舍五入(注意数据库差异)、ceil向上取整(含负数)、floor向下取整(含负数);三者处理正负数、边界值行为不同,需结合场景谨慎选用。

SQL 中的数值函数 ROUND、CEIL 和 FLOOR 是处理数字精度和取整的核心工具,用错一个就可能导致报表金额偏差、分页错位或统计失真。关键不是记语法,而是理解它们对正负数、小数位、边界值的真实行为。
ROUND:四舍五入,但“5”的处理要看数据库
ROUND(x, d) 把 x 四舍五入到小数点后 d 位。注意:不同数据库对“.5”结尾的处理可能不同——MySQL、PostgreSQL 默认“四舍六入五成双”(银行家舍入),而 SQL Server 和 Oracle 通常直接“四舍五入”。
- ROUND(12.345, 2) → 12.35(多数场景)
- ROUND(12.345, 1) → 12.3 或 12.4(取决于系统设置,生产环境建议显式测试)
- ROUND(-12.345, 1) → -12.3(负数同样适用,方向一致)
- d 可为负数:ROUND(1234.56, -2) → 1200(向百位取整)
CEIL:向上取整,只进不舍
CEIL(x) 返回大于等于 x 的最小整数,不管正负、小数多小,一律“天花板式”进一。
- CEIL(3.1) → 4;CEIL(3.0) → 3;CEIL(-3.9) → -3(注意:-3 > -3.9,所以是向上)
- 常用于计算页数:CEIL(total_count / page_size) —— 即使剩1条也要多开1页
- 不支持小数位参数,如需保留1位小数再向上,可先乘10、CEIL、再除10:CEIL(x * 10) / 10.0
FLOOR:向下取整,只舍不进
FLOOR(x) 返回小于等于 x 的最大整数,和 CEIL 对称,但方向相反。
- FLOOR(3.9) → 3;FLOOR(-3.1) → -4(因为 -4
- 适合分组截断:FLOOR(score / 10) * 10 得出“70–79 分”组的基准值(如 78→70)
- 与 CEIL 配合可实现区间归类,比如把价格划入 0–99、100–199 等档位
实战避坑提醒
这些函数在 NULL 输入时统一返回 NULL,无需额外判断;但参与计算前务必确认字段类型——浮点型(FLOAT/REAL)可能因精度问题导致预期外的取整结果,建议先 CAST 为 DECIMAL。
- 别在 WHERE 中对索引列用 ROUND/CEIL/FLOOR——会跳过索引,拖慢查询
- 涉及金额运算,优先用 ROUND(x, 2),避免用 FLOOR/CEIL 处理货币(易引发少算或多算一分钱)
- 跨数据库迁移时,ROUND 行为差异最易出问题,建议封装成视图或应用层统一处理










