ROUND()函数最直接用于四舍五入,保留两位小数写法为ROUND(price, 2),返回如19.99、25.00;支持NULL输入返回NULL;负参数如ROUND(123.45, -1)表示向左舍入到十位得120.0。

ROUND() 是最直接、跨数据库通用的四舍五入函数,只要参数写对,它就按数学规则四舍五入,不是截断,也不是向上取整。
怎么用 ROUND() 保留两位小数?
这是最常见需求,比如价格、金额展示:
-
SELECT ROUND(price, 2)—— 直接对字段四舍五入到小数点后两位 - 结果如
19.99、25.00(注意:末尾零会保留,类型可能是DECIMAL或FLOAT,不是字符串) - 如果原始值是
NULL,ROUND(NULL, 2)仍返回NULL,不会报错但可能影响后续聚合 - MySQL/PostgreSQL/SQL Server 行为一致;Oracle 对负零有细微差异,但日常几乎无感
ROUND(column, -1) 这种负数参数到底干啥?
它不是报错,而是对小数点左边“按位”四舍五入,常用于数据归类或简化报表:
-
ROUND(123.45, -1)→120.0(个位四舍五入到十位) -
ROUND(626.3, -3)→1000.0(百位 ≥ 500,进千位) -
ROUND(1.98, -1)→0.0(因为是在“十位”上判断,1.98 - 别误以为是 bug——这是标准行为,但容易被当成逻辑错误,尤其在分组统计时
为什么 ROUND(1.235, 2) 有时返回 1.23 而不是 1.24?
这不是函数问题,是浮点精度丢失导致的真实值偏差:
- 存储的可能是
1.2349999999999999,而非精确的1.235 - 典型场景:来自计算列,比如
ROUND(SUM(a)/COUNT(b), 2) - 解决办法:先转定点数再四舍五入,例如
ROUND(CAST(SUM(a)/COUNT(b) AS DECIMAL(10,3)), 2) - 别依赖
CAST(... AS DECIMAL(10,2))单独使用——它虽自动四舍五入,但若源值本身已失真,结果照样不准
要不要用 CAST 或 CONVERT 替代 ROUND?
可以,但目的不同,不能简单互换:
-
CAST(price AS DECIMAL(10,2))是类型转换 + 隐式四舍五入,结果类型固定为DECIMAL,且末尾零会被“抹掉”(如25.00变成25.0或25,取决于数据库) -
ROUND(price, 2)保持原类型(如FLOAT),只改数值,更可控 - SQL Server 中
CONVERT(DECIMAL(10,2), price)和CAST效果类似,但CAST更符合 ANSI 标准,推荐优先用 - 真正要注意的是:别混用
ROUND(x, 2, 1)(第三个参数为 1 表示截断),这在 SQL Server 存在,但 MySQL 不支持,跨库时极易出错
ROUND(),但必须意识到:它处理的是当前值,而当前值是否精确,取决于上游计算或存储类型。浮点字段(FLOAT、REAL)天生不适合做精确四舍五入,该用 DECIMAL 存就别省那点空间。

















