Шесть лет (округлено) спустя, вот мой вклад - маленький трюк, который я узнал давно, и удивлен, что никто больше не упомянул здесь.
Идея состоит в том, чтобы сделать округление, добавив половину делителя к числителю перед выполнением деления.
int height2 = (width2 * height1 + width1 / 2) / width1;
На самом деле я бы не рекомендовал делать это в случаях, таких как ОП, где делитель является переменной. Вместо этого может быть лучше использовать Math.Round (), так как это гораздо легче понять.
Но в случаях, когда делитель является константой, я использую этот трюк. Так что вместо
int height2 = width2 * height1 / 4; // No rounding
Я бы использовал
int height2 = (width2 * height1 + 2) / 4;
Вот более типичный пример
private static Size ResizeWithPercentage(Size oldSize, int resizePercentage)
{
return new Size((oldSize.Width * resizePercentage + 50) / 100,
(oldSize.Height * resizePercentage + 50) / 100);
}
Другая возможность состоит в том, чтобы объединить этот трюк с идеей, упомянутой Донгилмором и суперкатом, о том, что вместо деления на два заданных или подразумеваемых вы можете умножить числитель и знаменатель на два.
int height2 = (width2 * height1 * 2 + width1) / (width1 * 2);
Это дает лучшие ответы в тех случаях, когда делителем является или может быть нечетное число.