首页/数据/数据库速查/数值函数:ROUND / CEIL / FLOOR / ABS / 取模与类型转换
SQL 语法52 条

数值函数:ROUND / CEIL / FLOOR / ABS / 取模与类型转换

数值计算与取舍、类型转换 CAST/CONVERT;金额与精算用 DECIMAL,浮点等高比较要做容差处理。

数据库速查数据更新于 2026-10-13

数值函数是什么

数值函数负责取整、取模、绝对值与类型转换:ROUND 四舍五入、CEIL 向上取整、FLOOR 向下取整、ABS 取绝对值、MOD 取余,CAST/CONVERT 用来在数字、字符串、日期之间做显式转换。写业务时真正要记住的是存储类型而不是函数:金额与精算必须落在 DECIMAL 上,FLOAT/DOUBLE 是二进制浮点,永远存在 0.1 + 0.2 ≠ 0.3 的表示误差。

基本信息

适用版本MySQL 5.7 / 8.0
取整与舍入ROUND(x, d)、CEIL/CEILING(x)、FLOOR(x)、TRUNCATE(x, d)
其他常用ABS(x)、MOD(n, m)、POW(x, y)、SQRT(x)
类型转换CAST(expr AS type)、CONVERT(expr, type)
精确小数DECIMAL(p, s),p 总位数、s 小数位数
浮点误差FLOAT/DOUBLE 为二进制浮点,比较需容差

典型使用场景

  • 报表金额格式化:按分或万分位取整,输出前统一 ROUND 到两位小数
  • 分页与取模分片:用 MOD 做哈希取模或余数分组
  • 日期与数字互转:把 20261012 这类数字批量转成 DATE 再比较
  • 浮点结果比较:用 ABS(a - b) < 0.000001 代替等号判断
  • 对账差值定位:对两表金额做减法并取绝对值,快速筛出差异行

常用示例

常用示例
-- 取整与舍入
SELECT ROUND(3.14159, 2) AS pi2, FLOOR(3.9) AS f, CEIL(3.1) AS c;
-- 负数取整方向与直觉相反:FLOOR(-1.1) = -2
SELECT FLOOR(-1.1) AS floor_neg, CEIL(-1.1) AS ceil_neg;
-- 取模常用作分片键与奇偶判断
SELECT MOD(10, 3) AS m, ABS(-12) AS a;
-- 类型转换:字符串转日期、小数转整数
SELECT CAST('2026-10-12' AS DATE) AS d, CAST(12.5 AS SIGNED) AS i;
-- 浮点等号比较不成立,结果为 0
SELECT 0.1 + 0.2 = 0.3 AS float_eq;
SELECT ABS(0.1 + 0.2 - 0.3) < 0.000001 AS ok;   # 正确做法:容差比较

函数对照与注意点

函数作用注意点
ROUND(x, d)四舍五入到 d 位银行家舍入不适用,金额舍入规则要写在业务层
TRUNCATE(x, d)直接截断不做进位对账差异常来自这里与 ROUND 混用
CEIL / FLOOR向上 / 向下取整负数方向按数轴,FLOOR(-1.1) 是 -2
MOD(n, m)取余数分片场景要固定正数范围,负数结果需修正
CAST / CONVERT显式类型转换非法值在严格模式下报错、非严格下变 NULL 并告警
金额、发票、库存等字段严禁用 FLOAT/DOUBLE 存:二进制浮点无法精确表示 0.1 这类十进制小数,累加后会出现分位偏差,且随着数据量增大差异被不断放大,最终只能用 DECIMAL 重建字段并洗数据。
MySQL 的整数除法:/ 会得到小数结果(如 5/2 = 2.5),需要整除要用 DIV 或 FLOOR;除数或操作数为 NULL 时结果为 NULL 而不报错,聚合时要留意 NULL 传播。

易错点

  • 用 FLOAT 存金额再求和:结果出现 0.000001 级别偏差,对账永远平不了
  • 浮点直接用等号比较:0.1 + 0.2 = 0.3 返回 0,条件永远不成立,逻辑静默失效
  • CAST 转换前不校验数据:脏数据在严格模式直接让整批语句失败,非严格模式下变成 NULL 且只留告警
  • 混用 ROUND 与 TRUNCATE 做同一口径统计:两条 SQL 结果差几分,报表之间互相打架
  • MOD 分片时忽略负数与 NULL:余数为负导致分片键落到预期外的分区,数据倾斜且难排查

数据来源与参考

  • MySQL 8.0 Reference Manual: Mathematical Functions

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌