Sql server SQL Server中的四舍五入?
我已经为SQLServer编写了一个分页系统。它工作得很好,但我试图返回总共有多少页 因此,如果每页有5条记录和2条记录,那么总共是3页 这就是我所拥有的Sql server SQL Server中的四舍五入?,sql-server,stored-procedures,rounding,Sql Server,Stored Procedures,Rounding,我已经为SQLServer编写了一个分页系统。它工作得很好,但我试图返回总共有多少页 因此,如果每页有5条记录和2条记录,那么总共是3页 这就是我所拥有的 SELECT @TotalPages = ( (SELECT COUNT(*) FROM #TempItems) / @RecsPerPage ) 我的输出参数定义如下 @TotalPages AS INT OUT, 在我的测试中,每页有5条记录和2条记录,所以上面的选择返回2条,但它错了,应该是3条 这是因为它说5/2=整数
SELECT @TotalPages = ( (SELECT COUNT(*) FROM #TempItems) / @RecsPerPage )
我的输出参数定义如下
@TotalPages AS INT OUT,
在我的测试中,每页有5条记录和2条记录,所以上面的选择返回2条,但它错了,应该是3条
这是因为它说5/2=整数2。。。我怎样才能把……集中起来
我把天花板弄坏了,但没能使它工作
有什么想法吗
提前感谢您是否尝试将分子和分母转换为浮点数,然后使用Cieling 整数运算总是给出整数。尝试下列方法:
SELECT @TotalPages = CEILING((SELECT cast(COUNT(*) as float) FROM #TempItems) / @RecsPerPage )
整数数学不是四舍五入,而是截断。将
@RecsPerPage
更改为浮点而不是int,然后在sql语句中使用ceil
。试试看
SELECT @TotalPages = CEILING( (SELECT COUNT(*) FROM #TempItems) * 1.0/ @RecsPerPage )
当您除以两个整数时,SQL Server将始终给出一个整数结果 您可以在实际硬编码值的末尾添加“.0”,或乘以“1.0”转换字段值。如果你想取整,那么我知道的最好的方法就是加上0.5,然后调用普通的取整函数。这是因为向下取整(数字+.5)总是与向上取整(数字)相同 正如其他人所指出的,您还可以手动将字段强制转换为浮点 但请注意
round(1.0 / 2.0,0)
将返回一个浮点结果,而
round(cast(1 as float) / cast(2 as float),0)
将给出一个整数结果。所以,选择最适合你的
所有这些都在下面的示例中进行了说明:
SELECT
ROUND(5/2,0) AS INTEGER_EXAMPLE
,ROUND((5.0 / 2.0),0) AS FLOATING_POINT_EXAMPLE
,ROUND(CAST(5 AS FLOAT) / CAST(2 AS FLOAT),0) AS CASTING_EXAMPLE
,ROUND((5 * 1.0) / (2 * 1.0),0) AS CONVERTED_TO_FP_EXAMPLE
,ROUND(((1 * 1.0) / (4 * 1.0)) + (1.0 / 2.0),0) AS ROUNDED_UP_EXAMPLE
这里有一个函数,可以为您进行汇总,还有一个SELECT可以向您显示它给出的结果
create function roundup(@n float) returns float
as
begin
--Special case: if they give a whole number, just return it
if @n = ROUND(@n,0)
return @n;
--otherwise, add half and then round it down
declare @result float = @n;
declare @half float = (1.0 / 2.0);
set @result = round(@n + @half,0);
return @result;
end
GO
select
dbo.roundup(0.0) as example_0
,dbo.roundup(0.3) as example_pt_three
,dbo.roundup(0.5) as example_pt_five
,dbo.roundup(0.9) as example_pt_nine
这里有一些类似的代码。CAST函数防止SQL自动取整。将0.00调整为所需的精度
declare @C int
declare @D int
SET @C = 5
SET @D = 2
DECLARE @Answer FLOAT
SELECT @Answer = CAST(@C as FLOAT) / CAST(@D as FLOAT)
SET @Answer = CASE WHEN @Answer - ROUND(@Answer, 0) > 0.00 THEN ROUND(@Answer, 0) + 1
ELSE ROUND(@Answer, 0) END
PRINT @Answer
编辑-更正舍入参数。对于0,您可以使用整数算术:
SELECT @TotalPages = ((SELECT COUNT(*) FROM #TempItems) + @RecsPerPage - 1) / @RecsPerPage
(我在很多很多年前就知道了这个公式(在互联网出现之前,你可以这样问),并且已经使用过很多次。)保留你原来的公式,但是你需要检查余数是否大于0,如果是,只需在结果中加1即可。很好!!亲爱的,爱这个解决方案定义的函数是有用的@josephstyons@rezaakhlaghi,我很高兴你发现它很有用。
DECLARE @Count int
SELECT @Count = COUNT(*) FROM #TempItems
SELECT @TotalPages = @Count / @RecsPerPage
IF @Count % @RecsPerPage > 0 SET @TotalPages = @TotalPages +1