将值四舍五入到最接近的 50
Rounding the value to the nearest 50
我正在尝试将值向下舍入到最接近的 50。
1-50 它应该向下舍入到 00 以下,当它的 51 休息时它应该向下舍入到 50
例如:
- 245(直到 1-49)它应该向下舍入到 200
- 258(从 50-99)然后它应该向下舍入到 250
我试过了,效果不错,但我需要 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 and
select 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)
我正在尝试将值向下舍入到最接近的 50。 1-50 它应该向下舍入到 00 以下,当它的 51 休息时它应该向下舍入到 50
例如:
- 245(直到 1-49)它应该向下舍入到 200
- 258(从 50-99)然后它应该向下舍入到 250
我试过了,效果不错,但我需要 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 and
select 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)