.NET метод округлить число до ближайшего кратного другого числа? - PullRequest
12 голосов
/ 19 декабря 2008

Я ищу метод, который может округлить число до до ближайшего кратного другого. Это похоже на квантование.

Например. Если я хочу округлить 81 до ближайшего кратного 20, он должен вернуть 100.

Есть ли метод .NET Framework, который я могу использовать для этого?

Причина, по которой я прошу встроенный метод, заключается в том, что есть большая вероятность, что он уже оптимизирован.

Ответы [ 4 ]

11 голосов
/ 19 декабря 2008

Да, целочисленная арифметика.

Чтобы округлить m до следующего кратного n, используйте ((m + n-1) / n) * n

7 голосов
/ 19 декабря 2008
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
*/
5 голосов
/ 28 июля 2011

Ответ Ли хорош, но он должен был быть:

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

Обратите внимание на изменение с N на M. Операция по модулю должна выполняться с множителем (m), а не с числом (n).

1 голос
/ 26 января 2009

Если вы используете много из них на относительно медленной платформе, вы можете исключить умножение с помощью варианта:

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

Конечно, если вы можете ограничить ваше кратное значениями 2 ^ n, то операция модуля также может быть признана устаревшей в пользу ее логического эквивалента (обычно "&").

Кстати, показанная выше функция «округления» имеет серьезные недостатки и будет корректно округляться только тогда, когда {(m% n) == (n - 1)}; округление вниз подразумевается для целочисленного деления и, как таковое, не требует компенсации.

...