Skip to content

SQL Round() 函数

SQL 中的 ROUND() 函数用于将数值四舍五入到指定的小数位数或最近的整数。这对于数据呈现、财务计算以及确保数值数据的一致性至关重要。

理解四舍五入行为(重要说明)

Section titled “理解四舍五入行为(重要说明)”

需要注意的是,不同的数据库系统和配置在处理四舍五入时,尤其是对于以 ‘.5’ 结尾的数字(中点值),可能会有不同的行为。一种常见的行为,通常与 IEEE 754 标准一致,是“四舍五入到最近的偶数”(也称为“银行家舍入”)。在这种规则下:

  • 像 11.5 这样的数字四舍五入到最近的偶数整数,所以 ROUND(11.5, 0) 结果可能是 12。
  • 像 12.5 这样的数字也四舍五入到最近的偶数整数,所以 ROUND(12.5, 0) 结果也可能是 12。
  • 传统的学校四舍五入(将 .5 向上取整)并非总是默认行为。如果采用这种规则,例如 ROUND(11.5, 0) 将是 12,而 ROUND(12.5, 0) 将是 13。
  • 如果精确的中点四舍五入行为至关重要,请务必在您特定的 DBMS 中测试 ROUND() 的行为。

SELECT ROUND(numeric_column_or_value, number_of_decimals) FROM table_name;

或者,在对字面值进行四舍五入时:

SELECT ROUND(numeric_value, number_of_decimals);

ParameterDescription
numeric_column_or_value必需。要进行四舍五入的数值字段或字面值。可以是数值类型(例如 DECIMAL、FLOAT、DOUBLE)的列名,也可以是直接的数字。
number_of_decimals必需。一个整数,指定要四舍五入到的小数位数。
- 如果为正数,则四舍五入到指定的小数位数(例如,2 表示 xx.yy)。
- 如果为零,则四舍五入到最近的整数(例如,xx)。
- 如果为负数(某些 DBMS 支持,如 Oracle、PostgreSQL),则四舍五入到小数点左侧(例如,-1 四舍五入到最近的 10,-2 到最近的 100)。

为了演示,我们将使用一个简化的 Products 表,类似于 Northwind 示例数据库中的表。

Products 表示例数据:

ProductIDProductNameUnitPrice
1Chai18.00
2Chang19.00
3Aniseed Syrup10.00
4Chef Anton’s Cajun Seasoning22.357
5Chef Anton’s Gumbo Mix21.35
6Grandma’s Boysenberry Spread25.495

示例 1:将产品价格四舍五入到最近的整数。

SELECT ProductName, UnitPrice, ROUND(UnitPrice, 0) AS RoundedToInteger
FROM Products;

结果可能如下所示(取决于对 .5 的具体四舍五入规则):

ProductName | UnitPrice | RoundedToInteger
-----------------------------|-----------|-----------------
Chai | 18.00 | 18
Chang | 19.00 | 19
Aniseed Syrup | 10.00 | 10
Chef Anton's Cajun Seasoning| 22.357 | 22
Chef Anton's Gumbo Mix | 21.35 | 21
Grandma's Boysenberry Spread| 25.495 | 25 or 26 (depending on .5 handling)

示例 2:将产品价格四舍五入到小数点后一位。

SELECT ProductName, UnitPrice, ROUND(UnitPrice, 1) AS RoundedToOneDecimal
FROM Products;

结果可能如下所示:

ProductName | UnitPrice | RoundedToOneDecimal
-----------------------------|-----------|--------------------
Chai | 18.00 | 18.0
Chang | 19.00 | 19.0
Aniseed Syrup | 10.0 | 10.0
Chef Anton's Cajun Seasoning| 22.357 | 22.4
Chef Anton's Gumbo Mix | 21.35 | 21.4
Grandma's Boysenberry Spread| 25.495 | 25.5

示例 3:四舍五入到最近的十位(如果您的 DBMS 支持,使用负数小数位数)。

-- 这种负数小数位数的语法在 Oracle、PostgreSQL 中很常见。
-- MySQL 的 ROUND() 可能表现不同,或需要使用 TRUNCATE 来实现此效果。
SELECT ProductName, UnitPrice, ROUND(UnitPrice, -1) AS RoundedToNearestTen
FROM Products WHERE ProductID IN (4,6);

结果(例如对于 PostgreSQL/Oracle):

ProductName | UnitPrice | RoundedToNearestTen
-----------------------------|-----------|--------------------
Chef Anton's Cajun Seasoning| 22.357 | 20
Grandma's Boysenberry Spread| 25.495 | 30
  • 财务报告:以标准的两位小数显示货币值。
  • 数据清洗:标准化从不同来源导入的数值数据的精度。
  • 用户界面显示:以更友好、更整洁的格式呈现数字。
  • 统计计算:在进一步分析前调整精度。

SQL 提供了其他用于数值调整的函数:

  • FLOOR(numeric_value): 返回小于或等于 numeric_value 的最大整数值(向下取整)。
  • CEILING(numeric_value) 或 CEIL(numeric_value): 返回大于或等于 numeric_value 的最小整数值(向上取整)。
  • TRUNC(numeric_value, [decimals]) 或 TRUNCATE(numeric_value, decimals): 将数字截断到指定的小数位数,不进行四舍五入。负数或第二个参数的行为可能因 DBMS 而异。

务必查阅您的特定 DBMS 文档,了解这些函数的精确行为,尤其是在四舍五入规则和参数支持方面。