在SQL Server中将数字*向上*舍入到最接近的100。

65

在SQL Server中,是否有办法轻易地将数字 向上 取整到最接近100(或1000、500、200等)的整数?

例如:

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

17个回答

74
以下内容应该可以正常工作。在阅读了您的问题后,我不确定您希望100返回什么。对于此情况,100会返回100。

以下内容应该可以正常工作。在阅读了您的问题后,我不确定您希望100返回什么。对于此情况,100会返回100。

select floor((X + 99) / 100) * 100;
这将产生以下结果:
0 -> 0
1 -> 100
99 -> 100
100 -> 100
101 -> 200

我需要用C#实现同样的功能,上面的公式很有效。唯一的小问题是,如果X为负数,则无法正常工作。我解决这个问题的方法(不太确定SQL语法,但应该很容易理解)是确保X始终为正数(Abs(X)),然后乘以-100。 - Nigel Ellis
3
很抱歉要说,但这个答案似乎只适用于整数值。X=100.25仍然会得到100而不是四舍五入到200。@Krock的上取整答案对浮点数和小数运算更有效。 - bmadtiger
@rkgit的回答似乎更好。我在https://napier.sqlzoo.net/wiki/SELECT_from_WORLD_Tutorial中寻找第10个问题的答案,而rkgit的答案被接受为正确答案。那个答案是round(YourValue, -3)。 - Atul Kumar

64

要将数字四舍五入到最近的千位数,请尝试以下方法:

select round(YourValue, -3)

6
这个结果向下取整,而不是向上。你可以试一下。选择 round(1005, -3) --结果为:1000 - Sameer Alibhai
4
正如有人指出的那样,这并不总是像问题所指定的那样向上舍入。 - James Bender

34

一个选项是使用 CEILING() 函数,例如:

SELECT CEILING(@value/100.0) * 100

根据数值类型,您可能需要先将其转换为十进制。


这并不总是按照问题中指定的方式进行向上舍入。例如,SELECT ROUND(129.0/100, 0) * 100返回100而不是200。 - Gyromite
@Gyromite 奇怪的是,我链接的网站是正确的,但我可能复制错了 :/ - krock
你能解释一下为什么要用100进行除法和乘法吗?另外,为什么选择向上取整而不是向下取整@krock - terry
3
@terry 这里的除法和乘法仅基于数学,理解这一点的唯一真正方法可能是通过示例。Ceiling函数的工作原理是将数字四舍五入到最近的整数向上取整。以下是一个快速示例: 您想将149舍入为200。 149/100 = 1.49,ceiling函数将其四舍五入到最近的整数,即2。然后,您将2乘以100,就得到了200。该数学概念适用于您想要舍入的任何固定间隔。如果您想要向上舍入至最接近8:149/8 = 18.625,将其舍入到19,然后19x8 = 152。 152是向上舍入的最近的8的整数倍! :) - LittleTreeX

9
使用CEILING函数将数字向上取整。
DECLARE @Number DECIMAL, @RoundUp DECIMAL
SET @RoundUp = 100
SET @Number = 720
SELECT CEILING(@Number/@RoundUp)*@RoundUp

4

Try this:

select round(@value , -2);


1
这并不总是按照问题中指定的方式进行向上舍入。例如,select round(129.0, -2);返回100而不是200。 - Gyromite

4

使用简单的 ROUND 函数,将数字四舍五入到最接近的十位倍数非常简单。 例如:

SELECT ROUND(number/1000,2)*1000 

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

1
这也适用于带小数的值。

1

对于整数值它运作得很好:

@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

非常好的解决方案。这就是我一直在寻找的。谢谢! - Sanjeev Singh

0
一个通用的解决方案 - 使用 MOD 运算找到倒数第100位,然后将结果加上100。
select (720 - MOD(720,100)) + 100 from dual;

如果您需要下一个80个位置,只需将任何“100”替换为“80”。

当输入值已经是100的倍数时,这个公式会出现问题。select (800 - (800 %100)) + 100;将给出900而不是800。 - Gyromite

0
Select round(value/100,0)*100

无论你想要舍入到哪个数字,只需在此处发布该数字,而不是100


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接