我想要舍入一个数字(十进制),以便它可以被5整除。
例如,我有一些数字和数字后的数字:
Number Rounded
0.4 5
3.4 5
7.3 10
我可以使用ceil
将此double
转换为int
并使用while
循环将它们转到下一个5的倍数,但我想知道是否存在是实现这一目标的任何聪明方式。
感谢。
答案 0 :(得分:36)
您可以先除以5,然后使用Math.Ceiling对值进行舍入。之后,你可以再次乘以5。
int rounded = (int) Math.Ceiling(Number / 5) * 5
答案 1 :(得分:10)
如果你想要
f[6] = 10
f[-1] = 0
f[-6] = -5
Sören's answer没问题。
如果您想要:
f[6] = 10
f[-1] = -5
f[-6] = -10
你可以做点什么:
f[x_] := Sign[x] Ceiling[Abs[x]/5] * 5
C#:
var rounded = (int) Math.Sign(x) * Math.Ceiling(Math.Abs(x)/5) * 5;
答案 2 :(得分:6)
怎么样:
5 * decimal.Ceiling(num / 5)
答案 3 :(得分:0)
所有陈述的答案都很好,但是如果您需要性能,我怀疑您在 C# 中会得到比这更快的任何东西:
int i = Convert.ToInt32(input);
return (i % 5) == 0 ? i : i + 5 - (i % 5);
LinqPad 中的快速测试表明,这比迄今为止给出的最快答案平均快 50%。这是如果您按照 OP 的要求以小数开头。
如果您从整数开始运行,则第一行是不必要的,并且 return 语句的运行速度大约比最接近的竞争对手快 17 倍。