【问题标题】:Rounding UP in SQL Server?在 SQL Server 中四舍五入?
【发布时间】:2010-11-18 15:33:10
【问题描述】:

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

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

这就是我所拥有的

   SELECT @TotalPages = ( (SELECT COUNT(*) FROM #TempItems) / @RecsPerPage )

我的输出参数是这样定义的

   @TotalPages AS INT OUT,

现在它有点工作了 :-) 在我的测试中,每页有 5 条记录和 2 条记录,所以上面的选择返回 2 但它的错误应该是 3

这是因为它说 5 / 2 = 整数 2...我如何四舍五入...?

我厌倦了天花板,但无法让它工作..

有什么想法吗?

提前致谢

【问题讨论】:

    标签: sql-server stored-procedures rounding


    【解决方案1】:

    您是否尝试将分子和分母转换为浮点数,然后使用 Cieling?

    整数运算总是给出整数。试试下面的 -

    SELECT @TotalPages = CEILING((SELECT cast(COUNT(*) as float) FROM #TempItems) / @RecsPerPage ) 
    

    【讨论】:

      【解决方案2】:

      您可以为此使用整数算术:

      SELECT @TotalPages = ((SELECT COUNT(*) FROM #TempItems) + @RecsPerPage - 1) / @RecsPerPage
      

      (我在很多很多年前就想出了这个公式(在互联网上你可以问这样的想法之前),并且已经用过很多次了。)

      【讨论】:

      • 不错!!喜欢这个解决方案
      【解决方案3】:

      当您将两个整数相除时,SQL Server 将始终给出整数结果。

      您可以在实际硬编码值的末尾添加“.0”,或乘以“1.0”来转换字段值。如果要四舍五入,那么我知道的最好方法是加 0.5,然后调用普通的 ROUND 函数。之所以可行,是因为 ROUND_DOWN(number + .5) 始终与 ROUND_UP(number) 相同。

      正如其他人指出的那样,您还可以手动将字段转换为浮点数。

      但请注意

      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
      

      【讨论】:

      • 定义的函数很有帮助,亲爱的@josephstyons
      • @rezaakhlaghi,很高兴你发现它很有用。
      【解决方案4】:

      整数数学不会四舍五入,它会截断。将@RecsPerPage改为float而不是int,然后在你的sql语句中使用ceil

      【讨论】:

        【解决方案5】:

        试试

        SELECT @TotalPages = CEILING( (SELECT COUNT(*) FROM #TempItems) * 1.0/ @RecsPerPage ) 
        

        【讨论】:

          【解决方案6】:

          这里有一些类似的代码。 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

          【讨论】:

            【解决方案7】:
            DECLARE @Count int
            SELECT @Count = COUNT(*) FROM #TempItems
            SELECT @TotalPages = @Count / @RecsPerPage 
            IF @Count % @RecsPerPage > 0 SET @TotalPages = @TotalPages +1
            

            【讨论】:

              【解决方案8】:

              保留原来的公式,但您需要检查余数是否 > 0,如果是,只需将结果加 1。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2019-07-02
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2010-09-07
                • 1970-01-01
                • 2015-09-12
                相关资源
                最近更新 更多