round函数用于数值四舍五入,语法为round(number, decimals),其中number为数值表达式,decimals为保留小数位数(正数保留小数、0取整、负数向左舍入),mysql等主流数据库支持但行为略有差异。

ROUND 函数的基本用法和参数含义
SQL 中的 ROUND 函数默认四舍五入到整数位,要保留两位小数,必须显式传入第二个参数:小数位数。这个参数是必需的,否则结果可能不符合预期。
-
ROUND(123.456, 2)→123.46(正确) -
ROUND(123.456)→123(只取整,不是保留两位小数) - 第二个参数可以为负数,比如
ROUND(123.456, -1)→120,但保留小数时必须为非负整数
不同数据库对 ROUND 的实现差异
MySQL、PostgreSQL、SQL Server 都支持 ROUND(value, decimals) 形式,但 SQLite 默认不支持小数位参数(需启用扩展或改用 CAST(ROUND(x*100)/100 AS REAL));Oracle 则允许负数位,但行为一致。
- PostgreSQL 中
ROUND(123.455, 2)得123.46(标准四舍五入) - SQL Server 2022+ 和 MySQL 8.0+ 行为基本一致,但旧版 SQL Server 对浮点精度敏感,可能因底层类型导致
ROUND(1.005, 2)返回1.0而非1.01 - 如果字段是
DECIMAL(10,4)类型,ROUND后仍保持精度;但如果是FLOAT,先转成近似值再四舍五入,结果可能偏差
常见错误:看起来“没生效”其实是显示问题
执行 SELECT ROUND(price, 2) FROM orders; 返回的结果在某些客户端(如 DBeaver、MySQL Workbench)里仍显示多位小数,这不是 ROUND 失效,而是客户端自动格式化或字段元数据未更新所致。
- 确认是否真没生效:加个
CAST强制类型,例如CAST(ROUND(price, 2) AS DECIMAL(10,2)) - 在 SELECT 中 alias 字段名,比如
ROUND(amount, 2) AS amount_rounded,避免被工具按原列类型渲染 - 如果用于 GROUP BY 或 JOIN,注意
ROUND后值虽相同,但浮点比较仍可能失败——优先用DECIMAL字段存储原始值
需要精确财务计算时别只靠 ROUND
单纯 ROUND 无法解决银行常用“四舍六入五成双”(Banker’s Rounding),且它不处理中间计算的累积误差。例如多次 ROUND 相加 ≠ 先加总再 ROUND。
- 报表汇总时,应先 SUM 原始值,再整体
ROUND(SUM(amount), 2),而非对每行ROUND后求和 - 涉及货币,建表时就该用
DECIMAL(15,2)存储,而不是FLOAT或DOUBLE - 某些场景下,
TRUNCATE(如 MySQL 的TRUNCATE(x, 2))比ROUND更可控,但它不是标准 SQL,兼容性差
ROUND 算得没错,但你看到的未必是它输出的。











