在MySQL数值计算里,CEILING()、FLOOR()和ROUND()都用来处理小数,但取整逻辑完全不同。理解它们的差异,能避免统计偏差和分页错误。

一、三个函数的基本定义
CEILING()函数返回大于或等于指定数值的最小整数,也就是向上取整。无论小数部分多小,只要大于零就会进一位。FLOOR()函数则相反,返回小于或等于指定数值的最大整数,即向下取整,直接舍弃小数位。ROUND()函数按照四舍五入规则,将数值四舍五入到指定的小数位数,若不指定位数则取整。
从数学本质看,CEILING和FLOOR属于确定性边界函数,结果只取决于数轴方向;ROUND属于近似函数,依赖小数点后第一位是否达到五。在数据库查询中,选错函数会导致聚合结果偏移,尤其在金融与库存场景后果明显。
1.1 语法形式
三者语法都很简单。CEILING(expr)和FLOOR(expr)只接受一个参数;ROUND(expr)或ROUND(expr, decimals)可省略小数位参数。下面用一段SQL展示最基础的调用方式:
SELECT CEILING(2.1) AS c1, FLOOR(2.9) AS f1, ROUND(2.5) AS r1, ROUND(2.45, 1) AS r2;
上述语句中,c1得到3,f1得到2,r1得到3,r2保留两位小数并四舍五入得到2.5。可以看出ROUND在指定小数位时并不会影响整数部分的取舍逻辑。
二、负数场景下的差异
正数时三者区别直观,但负数常令人误解。CEILING(-2.3)结果是-2,因为-2大于-2.3且是最小整数;FLOOR(-2.3)结果是-3,向下远离零;ROUND(-2.5)在MySQL里四舍五入到偶数(银行家舍入)得到-2,而ROUND(-2.6)得到-3。
这种差异在温度统计、负债计算中容易被忽略。若用FLOOR处理零下温度区间,会低估寒冷程度;用CEILING处理退款额度,则可能多退钱。因此写SQL时必须结合业务方向选择函数。
2.1 对比示例
我们用同一组负数跑一遍,观察返回结果:
SELECT CEILING(-2.3) AS c_neg, FLOOR(-2.3) AS f_neg, ROUND(-2.5) AS r_neg1, ROUND(-2.6) AS r_neg2;
执行后c_neg为-2,f_neg为-3,r_neg1为-2,r_neg2为-3。可见ROUND并非单纯"四舍五入远离零",MySQL的ROUND对正好中点采用向偶数靠拢的策略,这点与部分编程语言不同。
三、实际应用如何选择
在分页计算中,总页数等于CEILING(总记录数 / 每页大小)。若误用FLOOR,最后一页数据会被丢掉;若用ROUND,记录数较少时可能算出零页。订单金额抹零场景,对客展示常使用FLOOR舍去分,而内部对账可用ROUND保留精度。
下面的存储过程片断演示了安全的总页数算法,明确调用CEILING避免丢失末尾数据:
-- 计算内容表总页数 SET @total = (SELECT COUNT(*) FROM articles); SET @page_size = 10; SET @pages = CEILING(@total / @page_size); SELECT @pages AS total_pages;
该写法保证哪怕余下一条记录也会多出一页。如果将CEILING换成FLOOR,当@total为95时只会得到9页,用户永远看不到第95条。这就是函数选错带来的隐性Bug。
3.1 性能与索引
三个函数都是确定性函数,MySQL优化器不会因此放弃索引,但它们用在WHERE条件中对列包裹时会使索引失效。例如WHERE FLOOR(price)=10无法走price索引,应改为范围查询。在SELECT列表中使用则无性能顾虑,仅增加微小CPU开销。
总结来说,明确取整方向就用CEILING或FLOOR,需要近似四舍五入用ROUND,并留意负数与中点规则。理清这些,SQL数值处理才稳妥。
MySQLCEILINGFLOOR_ROUND修改时间:2026-08-08 21:48:25