数值取整别再傻傻分不清,一篇文章帮你彻底搞懂
大家好。今天来聊聊SQL Server中的取整函数——ROUND、CEILING、FLOOR。它们在数据统计、金额计算、分页等场景中经常用到,搞清楚了能避免很多坑。
一、整数除法陷阱(最常踩的坑)
SELECT 3/4 AS 结果1, 4/3 AS 结果2, 5/3 AS 结果3
原因:整数除法返回整数,直接舍弃小数(不是四舍五入)。
解决方案:先转换为小数再除
SELECT 3*1.0/4 -- 0.750000SELECT CAST(3 AS DECIMAL(10,2))/4 -- 0.750000
二、三个核心取整函数
| | | |
|---|
| | CEILING(123.45) | |
| | FLOOR(123.45) | |
| | ROUND(123.45, 1) | |
三、CEILING:向上取整
返回大于或等于指定数字的最小整数。
SELECT CEILING(123.55) AS 正数, CEILING(123.45) AS 正数2, CEILING(-123.45) AS 负数, CEILING(0.0) AS 零
参数说明:
四舍五入并转为整数
SELECT CAST(ROUND(56.361, 0) AS INT) AS 结果1, -- 56 CAST(ROUND(56.561, 0) AS INT) AS 结果2 -- 57
五、实际应用场景
场景1:分页计算(向上取整)
DECLARE @total INT = 100, @pageSize INT = 30SELECT CEILING(@total * 1.0 / @pageSize) AS 总页数
场景2:金额四舍五入到分
DECLARE @price DECIMAL(10,4) = 99.99, @discount DECIMAL(3,2) = 0.7SELECT ROUND(@price * @discount, 2) AS 折后金额
场景3:整数除法(向上取整 vs 四舍五入)
DECLARE @dividend DECIMAL(20,2), @divisor DECIMAL(20,2)SET @dividend=3; SET @divisor=4SELECT CEILING(@dividend/@divisor) AS 向上取整 SET @dividend=4; SET @divisor=3SELECT CEILING(@dividend/@divisor) AS 向上取整 SET @dividend=5; SET @divisor=3SELECT CEILING(@dividend/@divisor) AS 向上取整 SET @dividend=3; SET @divisor=4SELECT CAST(ROUND(@dividend/@divisor, 0) AS INT) AS 四舍五入 SET @dividend=4; SET @divisor=3SELECT CAST(ROUND(@dividend/@divisor, 0) AS INT) AS 四舍五入 SET @dividend=5; SET @divisor=3SELECT CAST(ROUND(@dividend/@divisor, 0) AS INT) AS 四舍五入
关键区别:
六、其他相关函数
SELECT FLOOR(123.99) SELECT FLOOR(-123.45) SELECT CAST(123.99 AS INT) SELECT ABS(-123.45)
七、快速对照表
八、常见问题
Q:为什么3/4等于0?
A:整数除法截断小数,改成3*1.0/4或CAST(3 AS DECIMAL)/4。
Q:CEILING和ROUND有什么区别?
A:CEILING(1.1)=2(直接向上),ROUND(1.1,0)=1(四舍五入)。
Q:如何保留两位小数但不四舍五入?
A:用FLOOR(数值 * 100) / 100。
九、总结
| |
|---|
| |
| CEILING(总数*1.0/页大小) |
| ROUND(金额, 2) |
| FLOOR(数值) |
| CAST(数值 AS INT) |
一句话:向上取整用CEILING,四舍五入用ROUND,整数除法记得转小数!
阅读原文:原文链接
该文章在 2026/4/20 13:01:20 编辑过