将值四舍五入到最接近的 50

Rounding the value to the nearest 50

我正在尝试将值向下舍入到最接近的 50。 1-50 它应该向下舍入到 00 以下,当它的 51 休息时它应该向下舍入到 50

例如:

我试过了,效果不错,但我需要 case 语句以外的东西

@ResultAmount = ROUND(@ResultAmount, -2, 1) + 
    CASE    WHEN RIGHT(CONVERT(INT, FLOOR(@ResultAmount)), 2) IN (00, 50)
            THEN RIGHT(CONVERT(INT, FLOOR(@ResultAmount)), 2)
            WHEN RIGHT(CONVERT(INT, FLOOR(@ResultAmount)), 2) BETWEEN 1 AND 49
            THEN 00
            WHEN RIGHT(CONVERT(INT, FLOOR(@ResultAmount)), 2) BETWEEN 51 AND 99
            THEN 50
            END

提前致谢!!!

听起来数字 0-50 会四舍五入为“50”,但任何大于该数字的数字都应四舍五入为最接近的 50。类似以下内容应该有效:

(CASE WHEN f1/50 < 1 THEN 1 ELSE ceiling(f1/50) END) * 50 AS rounded_to_50

您可以简单地将数字除以 50,四舍五入,然后再乘以 50,例如:

select cast(round(@i/50.0,0)*50 as int)

如果 @i 是 524,这将是 return 500,如果 @i 是 525,则将是 550。

您可以创建一个函数来简化此操作:

create function fn_Round_By(@input int,@divider float) 
returns int
as
begin 
    RETURN (cast(round(@input/@divider,0)*@divider as int));
end

同样,select dbo.fn_Round_By(525,50) returns 550 andselect dbo.fn_Round_By(524,50)` returns 500.

如果您希望小于 50 的值将 向上 舍入为 50,您可以使用简单的 CASE,例如:

create function fn_Round_By(@input int,@divider float) 
returns int
as
begin 
    RETURN (
        CASE 
            WHEN @input <=@divider then @divider
            else cast(round(@input/@divider,0)*@divider as int)
        END
        );
end

向下舍入由 FLOOR 函数执行,因此向下舍入到特定间隔的函数为:

create function fn_Floor_By(@input int,@divider float) 
returns int
as
begin 
    RETURN (cast(FLOOR(@input/@divider)*@divider as int));
end

或者,保留将小于 50 的值四舍五入的逻辑:

create function fn_Floor_By(@input int,@divider float) 
returns int
as
begin 
    RETURN (
        CASE 
            WHEN @input <=@divider then @divider
            else cast(FLOOR(@input/@divider)*@divider as int)
        END
        );
end

这就是您所需要的

SELECT FLOOR(@ResultAmount / 50) * 50;

例如下面

declare @ResultAmount decimal(10,2) = 249;

SELECT FLOOR(@ResultAmount / 50) * 50;

SET @ResultAmount = 250;

SELECT FLOOR(@ResultAmount / 50) * 50;

SET @ResultAmount = 200;

SELECT FLOOR(@ResultAmount / 50) * 50;

SET @ResultAmount = 199;

SELECT FLOOR(@ResultAmount / 50) * 50;

您可以计算模 50 并用它来减少原始值

DECLARE @ResultAmount int = 243

SELECT @ResultAmount - (@ResultAmount%50)