在SQL查询和数据处理过程中,经常需要对计算结果或者存储的数值进行精度控制,保留指定位数的小数位是十分常见的需求。不同的业务场景对小数位保留的要求不同,有的需要四舍五入,有的需要直接截断,还有的需要格式化展示,因此需要掌握多种对应的实现方法。

使用ROUND函数四舍五入保留小数位
ROUND是SQL中内置的数值处理函数,默认会对数值进行四舍五入操作,语法为ROUND(数值, 保留的小数位数),如果保留的小数位数为负数,则会对整数部分进行四舍五入。
以下是MySQL和SQL Server通用的示例代码:
-- 保留2位小数,四舍五入 SELECT ROUND(123.4567, 2) AS result; -- 结果为123.46 -- 保留0位小数,即对整数部分四舍五入 SELECT ROUND(123.4567, 0) AS result; -- 结果为123 -- 保留-1位小数,对十位进行四舍五入 SELECT ROUND(123.4567, -1) AS result; -- 结果为120
使用CAST或CONVERT进行类型转换保留小数位
通过CAST函数将数值转换为指定精度的decimal类型,也可以实现保留小数位的效果,这种方式不会进行四舍五入,而是直接截断多余的小数位。decimal类型的语法为decimal(总位数, 小数位数),总位数需要大于等于小数位数。
示例代码如下:
-- 转换为decimal(10,2)类型,保留2位小数,直接截断 SELECT CAST(123.4567 AS decimal(10,2)) AS result; -- 结果为123.45 -- SQL Server中也可以使用CONVERT函数实现相同效果 SELECT CONVERT(decimal(10,2), 123.4567) AS result; -- 结果为123.45
使用FORMAT函数格式化小数位
FORMAT函数可以将数值按照指定的格式进行字符串化展示,适合需要输出固定格式字符串的场景,返回结果是字符串类型,而不是数值类型。语法为FORMAT(数值, 格式字符串),格式字符串中N代表数字,.N代表保留N位小数。
示例代码如下:
-- 格式化为保留2位小数的字符串 SELECT FORMAT(123.4567, '0.00') AS result; -- 结果为字符串'123.46' -- 保留3位小数,不足补0 SELECT FORMAT(123.4, '0.000') AS result; -- 结果为字符串'123.400'
不同方法的对比
三种常用方法的差异如下表所示:
| 方法 | 返回类型 | 是否四舍五入 | 适用场景 |
|---|---|---|---|
| ROUND函数 | 数值类型 | 是 | 需要数值计算,且要求四舍五入的场景 |
| CAST/CONVERT转换 | 数值类型 | 否(截断) | 需要数值类型结果,且不需要四舍五入的场景 |
| FORMAT函数 | 字符串类型 | 是 | 仅需要展示固定格式的小数字符串,不需要后续计算的场景 |
注意事项
- 使用CAST转换时,如果原数值的小数位少于指定的小数位数,会自动补0,不会报错。
- FORMAT函数在某些数据库(如MySQL 5.7以下版本)中不支持,需要根据实际使用的数据库版本选择方法。
- 如果保留的小数位数为0,ROUND函数会返回整数,而CAST转换为decimal(10,0)会返回带0位小数的数值。