SQL Server取整函数完全指南:ROUND、CEILING、FLOOR怎么用?
数值取整别再傻傻分不清,一篇文章帮你彻底搞懂
大家好。今天来聊聊SQL Server中的取整函数——ROUND、CEILING、FLOOR。它们在数据统计、金额计算、分页等场景中经常用到,搞清楚了能避免很多坑。
-- 两个整数相除,结果会自动截断小数部分SELECT 3/4 AS 结果1, 4/3 AS 结果2, 5/3 AS 结果3-- 结果:0, 1, 1
原因:整数除法返回整数,直接舍弃小数(不是四舍五入)。
解决方案:先转换为小数再除
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) |
返回大于或等于指定数字的最小整数。
SELECT CEILING(123.55) AS 正数, CEILING(123.45) AS 正数2, CEILING(-123.45) AS 负数, CEILING(0.0) AS 零-- 结果:124, 124, -123, 0
参数说明:
正数b:保留几位小数
负数b:精确到小数点左边几位
SELECT CAST(ROUND(56.361, 0) AS INT) AS 结果1, -- 56 CAST(ROUND(56.561, 0) AS INT) AS 结果2 -- 57
-- 计算总页数:总记录数100,每页30条,需要多少页?DECLARE @total INT = 100, @pageSize INT = 30SELECT CEILING(@total * 1.0 / @pageSize) AS 总页数-- 结果:4页
-- 计算折扣后金额,保留2位小数DECLARE @price DECIMAL(10,4) = 99.99, @discount DECIMAL(3,2) = 0.7SELECT ROUND(@price * @discount, 2) AS 折后金额-- 结果:69.99
DECLARE @dividend DECIMAL(20,2), @divisor DECIMAL(20,2)-- 向上取整SET @dividend=3; SET @divisor=4SELECT CEILING(@dividend/@divisor) AS 向上取整 -- 1SET @dividend=4; SET @divisor=3SELECT CEILING(@dividend/@divisor) AS 向上取整 -- 2SET @dividend=5; SET @divisor=3SELECT CEILING(@dividend/@divisor) AS 向上取整 -- 2-- 四舍五入取整SET @dividend=3; SET @divisor=4SELECT CAST(ROUND(@dividend/@divisor, 0) AS INT) AS 四舍五入 -- 1SET @dividend=4; SET @divisor=3SELECT CAST(ROUND(@dividend/@divisor, 0) AS INT) AS 四舍五入 -- 1SET @dividend=5; SET @divisor=3SELECT CAST(ROUND(@dividend/@divisor, 0) AS INT) AS 四舍五入 -- 2
关键区别:
CEILING:总是向上,4/3 = 1.33 → 2
ROUND:四舍五入,4/3 = 1.33 → 1
-- FLOOR:向下取整SELECT FLOOR(123.99) -- 123SELECT FLOOR(-123.45) -- -124-- 直接截断小数(不四舍五入)SELECT CAST(123.99 AS INT) -- 123-- 绝对值SELECT ABS(-123.45) -- 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,整数除法记得转小数!
阅读原文:原文链接