ROUND函数核心参数为数值表达式和小数位数,正数保留小数位、负数向左舍入;不同数据库对浮点精度和舍入规则(如银行家舍入)存在差异,需配合CAST转DECIMAL保障准确性。

ROUND函数的基本用法和参数含义
ROUND 在大多数主流数据库(MySQL、PostgreSQL、SQL Server、Oracle)中都支持,但行为细节有差异。核心是两个参数:ROUND(number, decimals) —— 第一个是要处理的数值(或表达式),第二个是保留的小数位数。
注意:decimals 可正可负:正数表示小数点后几位(如 2 → 保留两位小数),负数表示向左舍入(如 -1 → 十位取整)。
常见错误是传入字符串或 NULL 而不加判断,导致结果为 NULL 或报错(如 PostgreSQL 对类型更严格)。
不同数据库对 ROUND 的实现差异
MySQL 和 SQL Server 默认使用“四舍五入”,但 PostgreSQL 和 Oracle 的 ROUND 也如此,这点基本统一。真正容易踩坑的是浮点精度问题:
- 浮点列(如
float、real)参与ROUND后可能显示异常值,比如ROUND(1.235, 2)返回1.23而非1.24(因底层二进制存储误差) - PostgreSQL 中
ROUND(numeric, int)精确可靠,但ROUND(double precision, int)不保证 - SQL Server 的
ROUND(decimal, int)行为稳定,但若源字段是float,建议先CAST成decimal
实操建议:涉及金额或精确计算时,优先用 DECIMAL 类型字段,再调用 ROUND。
ROUND 和 CAST/CONVERT 配合控制输出格式
仅靠 ROUND 不会补零。例如 ROUND(1.5, 2) 得到 1.5,不是 1.50。需要格式化显示时,不能只依赖 ROUND。
各库常用组合方式:
- PostgreSQL:用
TO_CHAR(ROUND(val, 2), 'FM999999990.00') - SQL Server:用
FORMAT(ROUND(val, 2), 'N2')(注意性能开销大)或CAST(ROUND(val, 2) AS DECIMAL(10,2)) - MySQL:
ROUND本身不补零,可用FORMAT(val, 2)(返回字符串)或CAST(ROUND(val, 2) AS DECIMAL(10,2))
关键点:如果下游应用依赖固定小数位字符串(如导出 Excel),ROUND + CAST 是最可控的方式;若只是中间计算,保持数值类型更安全。
ROUND 在 GROUP BY 或聚合中的典型误用
常见需求:按四舍五入后的价格分组统计。错误写法是 GROUP BY ROUND(price, -1) 看似合理,但要注意:
- MySQL 允许表达式直接用于
GROUP BY,但 PostgreSQL 要求该表达式必须出现在SELECT列表中(或启用non deterministic模式) - 若
price是float,ROUND(price, -1)可能因精度问题把本该同组的值分到不同桶里 - 更稳妥做法是先用子查询或 CTE 计算好
ROUND(price, -1) AS rounded_price,再GROUP BY rounded_price
另外,ROUND 不影响原始数据精度,但它在聚合中属于“计算列”,一旦参与 GROUP BY 或 ORDER BY,就要考虑执行计划是否能利用索引 —— 通常不能,需评估性能影响。
ROUND 的本质是数值截断操作,不是格式化工具。真正难的不是语法,而是搞清你的字段类型、数据库版本、以及下游是否真需要“看起来整齐”还是“计算准确”。这两者常常冲突。

















