Seis años (redondeados) después, aquí está mi contribución, un pequeño truco que aprendí hace mucho tiempo, y estoy sorprendido de que nadie más haya mencionado aquí.
La idea es redondear agregando la mitad del divisor al numerador antes de hacer la división.
int height2 = (width2 * height1 + width1/2)/width1;
En realidad, no necesariamente recomendaría hacerlo en casos, como los OP, donde el divisor es una variable. En su lugar, puede ser mejor utilizar Math.Round(), ya que es mucho más fácil de entender.
Pero en los casos en que el divisor es una constante, utilizo este truco. Así que en lugar de
int height2 = width2 * height1/4; // No rounding
que haría uso de
int height2 = (width2 * height1 + 2)/4;
Esto es un ejemplo más típico
private static Size ResizeWithPercentage(Size oldSize, int resizePercentage)
{
return new Size((oldSize.Width * resizePercentage + 50)/100,
(oldSize.Height * resizePercentage + 50)/100);
}
Otra posibilidad es combinar este truco con la idea mencionada por dongilmore y supercat que en vez de tener una división por dos especificada o implícita, puedes multiplicar el numerador y el denominador por dos.
int height2 = (width2 * height1 * 2 + width1)/(width1 * 2);
Esto da mejores respuestas en casos donde el divisor es, o puede ser, un número impar.
Es triste que después de un año todavía tenga que volver para hacer referencia a esta pregunta con el fin de averiguar cómo hacer las matemáticas en C#. En Delphi solo escribiría "137 * 3/4" y funcionaría. Pero no C#, C# te obliga a orar a los dioses del compilador antes de que puedas hacer lo que quieras. –