13

我正在寻找一种可以将一个数字四舍五入另一个最接近的倍数的方法。这是类似的量化。

例如。如果我想将 81 舍入到最接近的 20 的倍数,它应该返回 100。

.NET 框架中是否有内置方法可以用于此目的?

我要求内置方法的原因是因为它很有可能已经被优化了。

4

4 回答 4

12

是的,整数算术。

要将 m 向上舍入为 n 的下一个倍数,请使用 ((m+n-1)/n)*n

于 2008-12-19T13:21:55.227 回答
8
public static int RoundUp(int num, int multiple)
{
  if (multiple == 0)
    return 0;
  int add = multiple / Math.Abs(multiple);
  return ((num + multiple - add) / multiple)*multiple;
}


static void Main()
{
  Console.WriteLine(RoundUp(5, -2));
  Console.WriteLine(RoundUp(5, 2));
}

/* Output
 * 4
 * 6
*/
于 2008-12-19T13:22:38.283 回答
5

李的回答很好,但应该是:

t = m + n - 1; return (t - (t % m));

注意从N到的变化M。模运算应该用乘数(m)而不是数字来完成(n)

于 2011-07-28T12:04:44.003 回答
1

如果您在相对较慢的平台上使用其中的很多,您可以通过使用以下变体来消除乘法:

t = m + n - 1;返回 (t - (t % n));

当然,如果您可以将倍数限制为 2^n 的值,那么模数运算也可能会被弃用,取而代之的是它的逻辑等价物(通常是“&”)。

顺便说一句,上面说明的“RoundUp”函数存在严重缺陷,只有在 {(m % n) == (n - 1)}; 时才能正确向下舍入。向下舍入对于整数除法是隐含的,因此不需要补偿。

于 2009-01-26T00:47:10.883 回答