round函数用于数值四舍五入,参数为数值表达式和小数位数:正数保留小数位(如round(12.345,2)→12.35),0取整(round(9.7,0)→10),负数向左舍入(round(127,-1)→130);null输入返回null;结果类型继承源字段,尾随零需cast显式截断。

ROUND 函数能直接四舍五入,但结果类型和尾随零行为因数据库而异,不能默认当“格式化输出”用。
ROUND(column_name, decimals) 的基本用法
标准 SQL 中 ROUND 接收两个参数:数值表达式和小数位数。它不是字符串处理函数,不改变原始数据,只影响查询时的计算结果。
-
decimals为正数(如2):保留小数点后指定位数,ROUND(12.345, 2)→12.35 -
decimals为0:四舍五入到整数,ROUND(9.7, 0)→10 -
decimals为负数(如-1):对个位、十位等整数位四舍五入,ROUND(127, -1)→130 - 如果输入值是
NULL,ROUND总是返回NULL,不会报错
为什么 ROUND(13.145, 2) 返回 13.150 而不是 13.15
这是多数数据库(如 SQL Server、PostgreSQL)的默认行为:返回值类型继承自输入字段或表达式类型。如果原字段是 DECIMAL(10,3) 或浮点型,ROUND 结果仍带三位小数,只是最后一位可能是 0。
- 想彻底去掉尾随零?得显式转类型:
CAST(ROUND(price, 2) AS DECIMAL(10,2)) - MySQL 用户注意:
ROUND在某些版本中对浮点数有精度误差,比如ROUND(2.15, 1)可能返回2.1而非2.2(底层二进制表示问题) - Oracle 和 PostgreSQL 对
ROUND行为更一致,但依然不自动截断小数位宽度
ROUND 在 GROUP BY 或聚合场景下的常见误用
有人试图用 ROUND(SUM(amount), 2) 来“让汇总看起来整洁”,但这容易掩盖精度丢失问题。
- 先
SUM再ROUND是安全的;反过来(SUM(ROUND(amount, 2)))会导致每行单独四舍五入后再加总,结果可能和真实总和偏差明显 - 在财务类报表中,推荐先用高精度类型(如
DECIMAL(18,6))存原始值,只在最终 SELECT 层做ROUND,避免中间步骤累积误差 - 如果需要按百元/千元汇总,用负数位数更高效:
ROUND(total_sales, -2)比FLOOR(total_sales / 100) * 100更简洁且可读
真正难处理的不是怎么写 ROUND,而是它不解决显示格式问题——比如前端要“13.15”而不是“13.150”,就得靠应用层或数据库的 TO_CHAR/FORMAT 函数配合,或者提前用 CAST 固定精度。别指望一个数学函数包办数值计算和字符串呈现两件事。










