ROUND函数用于数值四舍五入,语法为ROUND(numeric_expression, length),length为正时保留小数位,为负时向左舍入(如十位、百位),省略则默认为0;不同数据库实现有差异,MySQL/SQL Server用传统四舍五入,PostgreSQL默认银行家舍入,浮点数输入易引发精度问题,建议先CAST为DECIMAL再使用。

ROUND函数的基本用法和参数含义
ROUND 函数在多数主流数据库(如 MySQL、PostgreSQL、SQL Server)中都支持,但行为细节有差异。核心参数是数值表达式和小数位数,例如 ROUND(3.14159, 2) 返回 3.14。注意:第二个参数可为负数,表示向左舍入(如 ROUND(1234.56, -2) 得 1200)。PostgreSQL 默认使用“四舍六入五成双”,而 MySQL 和 SQL Server 用传统四舍五入。
不同数据库对ROUND的实现差异
MySQL 的 ROUND 对浮点数遵循 IEEE 标准,可能引发意外结果,比如 ROUND(2.5, 0) 返回 2(偶数规则),但 ROUND(3.5, 0) 返回 4;SQL Server 则严格四舍五入;PostgreSQL 在 v13+ 中默认启用银行家舍入,可通过 ROUND(num::numeric, n) 强制转为精确十进制运算。若需跨库一致行为,建议先 CAST 成 DECIMAL 或 NUMERIC 类型再调用 ROUND。
常见错误:ROUND后结果仍是浮点精度问题
直接对 FLOAT 或 REAL 字段用 ROUND,可能输出看起来“多一位小数”的结果,比如 ROUND(1.235, 2) 显示为 1.23000002。这是因为底层二进制浮点表示无法精确存储十进制小数。解决方式:
- 确保输入字段类型为
DECIMAL(p,s)或显式CAST(x AS DECIMAL(10,3)) - 避免在
SELECT中只写ROUND(price, 2),应搭配类型转换,如ROUND(CAST(price AS DECIMAL(10,4)), 2) - 如果用于报表展示,优先在应用层格式化,而非依赖 SQL 舍入
ROUND在GROUP BY或聚合中的陷阱
当用 ROUND(amount, 2) 做分组时,看似相等的数值可能因原始精度差异被分到不同组。例如 1.234999 和 1.235001 经 ROUND(..., 2) 都变成 1.24,但若原始值存储为 FLOAT,计算中间态可能已失真。更稳妥的做法:
- 先用
CAST统一精度,再ROUND - 考虑用
ROUND(amount * 100) / 100.0强制整数运算路径(适用于 MySQL/SQL Server) - 在 WHERE 或 HAVING 中慎用
ROUND作条件判断,优先改用范围比较(如amount BETWEEN 1.235 AND 1.245)
实际业务中,最易被忽略的是数据类型源头——不是 ROUND 写得不对,而是传给它的值本身已是近似值。处理金额、度量等敏感字段时,务必从建表阶段就用 DECIMAL,而不是事后靠 ROUND 补救。


















