数值函数是什么
数值函数负责取整、取模、绝对值与类型转换: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 传播。