Sql server SQL Server中的四舍五入?

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=整数

我已经为SQLServer编写了一个分页系统。它工作得很好,但我试图返回总共有多少页

因此,如果每页有5条记录和2条记录,那么总共是3页

这就是我所拥有的

   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