导读:本期聚焦于小伙伴创作的《在MySQL中,CEILING()和FLOOR()函数与ROUND()函数有何不同?》,敬请观看详情。处理小数时如果搞不清取整规则,统计报表就容易出现金额对不上的情况。CEILING不管小数是多少都向上进一,FLOOR永远舍去小数部分,ROUND则按四舍五入处理。三者在负数场景下的表现差异尤其容易让人踩坑,比如负二点三用CEILING得到负二,FLOOR得到负三,ROUND看小数点后一位才决定。文章用具体SQL示例演示了同一条数据经过三种函数后的结果,并说明在分页计算总页数和订单金额精度控制时该选哪一个。

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

在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

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。