在* SQL Server中将* * *舍入到最接近的100

时间:2010-07-08 14:07:41

标签: sql-server math rounding

是否可以轻松地将数字向上舍入到SQL Server中最近的100(或1000,500,200等)?

所以:

720 - > 800个
790 - > 800个
1401 - > 1500

13 个答案:

答案 0 :(得分:47)

以下内容应该有效。在阅读了你的问题后,我不确定你想要100回归。为此100返回100。

select floor((X + 99) / 100) * 100;

这给出了以下结果:

0 -> 0
1 -> 100
99 -> 100
100 -> 100
101 -> 200

答案 1 :(得分:25)

对于四舍五入到最接近的千位,请尝试以下方法: -

select round(YourValue, -3)

干杯!!!!!

答案 2 :(得分:14)

一种选择是使用CEILING()函数,如下所示:

SELECT CEILING(@value/100.0) * 100

您可能需要先根据类型将值转换为小数。

答案 3 :(得分:8)

使用CEILING功能将数字向上舍入

DECLARE @Number DECIMAL, @RoundUp DECIMAL
SET @RoundUp = 100
SET @Number = 720
SELECT CEILING(@Number/@RoundUp)*@RoundUp

答案 4 :(得分:1)

试试这个:

  

选择回合(@value,-2);

答案 5 :(得分:0)

没有本机功能可以做到这一点,但是会有许多简单的数学技巧。一个例子:

DECLARE @Foo int
SET @Foo = 720

print @Foo
print (@Foo + 100) % 100
PRINT @Foo - (@Foo + 100) % 100

答案 6 :(得分:0)

您可以使用此代码,假设您的amount是int。如果不是,你需要施放,所以你得到整数除法。

If amount % 100 != 0 Then
   roundedAmount = ((amount / 100) * 100) + 100
Else
   roundedAmount = amount

您可能希望将其打包成user defined function

答案 7 :(得分:0)

通用解决方案 - 使用MOD查找最后的第100个位置,然后在结果中添加100个。

select (720 - MOD(720,100)) + 100 from dual;

如果您需要下一个第80位,只需更换任何" 100"用" 80"。

答案 8 :(得分:0)

使用ROUND函数将数字舍入到最接近的10的任意倍数非常简单 例如:

SELECT ROUND(number/1000,2)*1000 

这将为您提供最接近的千分之一值。

答案 9 :(得分:0)

除了Gray's回答, 我将使用以下内联函数:

CREATE FUNCTION dbo.udf_RoundNearest
(
@Number bigint,
@RoundNearest bigint,
@Direction int
)

RETURNS TABLE AS 
RETURN

SELECT CASE WHEN @RoundNearest>=@Number THEN @Number
       ELSE
        (
                (@Number + CASE 
                           WHEN @Direction = 0 --Round Down
                           THEN 0
                           ELSE CASE WHEN @Number % @RoundNearest = 0 THEN 0 ELSE @RoundNearest END
                           END) / @RoundNearest) * @RoundNearest

   END Number

参数定义:

  1. @Number - 您需要回合的数字
  2. @RoundNearest 10th,100th,1000th etc
  3. @Direction 0->一轮 向下 1->围捕
  4. 使用函数:

    SELECT * FROM dbo.udf_RoundNearest (1965,100,1) --> 2000
    SELECT * FROM dbo.udf_RoundNearest (1359,100,0) --> 1300
    SELECT * FROM dbo.udf_RoundNearest (1999,10,0) --1990
    SELECT * FROM dbo.udf_RoundNearest (80,100,0) --> 80 (if the @number parameter is less or equal the @RoundNearest parameter the result will be the @number itself
    

    它也可以用作表格 如:

    ;with tmp (Value) as
      (select 1236 union all select 6584 union all select 9999)
    
        select t.*, fn.Number
        from tmp t
        cross apply dbo.udf_RoundNearest (Value,100,0) fn
    
        /*Result Set
        Value   Number
        1236    1200
        6584    6500
        9999    9900*/
    

答案 10 :(得分:0)

这也适用于带小数的值。

select floor((ceiling (@value) + 99) / 100) * 100;

答案 11 :(得分:0)

这对我来说很好。

Round(@value/100, 0) * 100

答案 12 :(得分:0)

它对于整数值很好用:

@roundUpValue = ((@intValue / 1000) + 1) * 1000
@roundDownValue = (@intValue / 1000) * 1000

例如

declare @intValue as int = 1934
select ((@intValue / 1000) + 1) * 1000 as roundUp
select (@intValue / 1000) * 1000 as roundDown

如果您要舍入到最接近的500,则

select ((@intValue / 500) + 1) * 500 as roundUp