Для этого нужно всего лишь разделение и округление:
int value = 30;
int factor = 16;
int nearestMultiple =
(int)Math.Round(
(value / (double)factor),
MidpointRounding.AwayFromZero
) * factor;
Будьте осторожны, используя эту технику. Перегрузка Math.Round(double)
считает, что злой мутант MidpointRounding.ToEven
является наилучшим поведением по умолчанию, хотя то, что мы все узнали раньше в школе, это то, что CLR вызывает MidpointRounding.AwayFromZero
. Например:
var x = Math.Round(1.5); // x is 2.0, like you'd expect
x = Math.Round(0.5); // x is 0. WAT?!