Ответ 1
Да, целочисленная арифметика.
Чтобы округлить m до следующего кратного n, используйте ((m + n-1)/n) * n
Я ищу метод, который может округлять число до ближайшего кратного другого. Это аналогичное квантование.
Eg. Если я хочу округлить 81 до ближайшего кратного 20, он должен вернуть 100.
Есть ли метод встроенного метода в .NET framework, который я могу использовать для этого?
Причина, по которой я запрашиваю встроенный метод, заключается в том, что у него есть хороший шанс, что он уже оптимизирован.
Да, целочисленная арифметика.
Чтобы округлить m до следующего кратного n, используйте ((m + n-1)/n) * n
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
*/
Ответ Ли хороший, но он должен был быть:
t = m + n - 1; return (t - (t % m));
Обратите внимание на изменение от N
до M
. Операцию modulo следует выполнять с помощью множителя (m)
, а не с номером (n)
.
Если вы используете многие из них на относительно медленной платформе, вы можете исключить умножение, используя вариант:
t = m + n - 1; return (t - (t% n));
Конечно, если вы можете ограничить свое значение значением 2 ^ n, то операция модуля также может быть устаревшей в пользу ее логического эквивалента (обычно "&" ).
Кстати, функция "RoundUp", проиллюстрированная выше, серьезно испорчена и будет корректно округляться, когда {(m% n) == (n - 1)}; округление является неявным для целочисленного деления и как таковое не требует компенсации.