redondeo redondear primaria para numeros numero naturales enteros entero ejemplos decimales como c# math rounding

c# - redondear - redondeo de numeros ejemplos



C#: ¿Cómo hago matemáticas simples, con redondeo, en enteros? (12)

quiero el resultado de una ecuación redondeada al entero más cercano. p.ej

137 * (3/4) = 103

Considere el siguiente código incorrecto.

int width1 = 4; int height1 = 3; int width2 = 137; int height2 = width2 * (height1 / width1);

¿Cuál es la forma correcta de realizar cálculos "enteros" en C #?

¿De verdad tengo que hacer?

int height2 = (int)Math.Round( (float)width2 * ((float)height1 / (float)width1) );


Como se dijo anteriormente, debes hacer la multiplicación antes de la división. De todos modos, podrías escribir tu expresión con solo el divisor:

int height2 = (int)Math.Round(width2 * (height1 / (float)width1));


Elabore el mensaje de Jeffery, ya que generalmente hay una mejor posibilidad de decimales truncados que los que necesita para desbordar un entero de 32 bits (y porque la multiplicación y la división son conmutativas), generalmente debe hacer la multiplicación antes de la división.


Primero haga la multiplicación (siempre que no sea probable que se desborde) y la división en segundo lugar.

3/4 == 0 en matemáticas enteras (las matemáticas enteras no redondean en la división, trunca).

Si realmente necesitas redondear, tienes que trabajar en punto fijo, punto flotante o jugar con el módulo.


int height2 = (width2 * height1) / width1;


Arreglaré el código incorrecto agregando cero líneas de código:

float width1 = 4; float height1 = 3; float width2 = 137; float height2 = width2 * (height1 / width1);

Debe usar flotantes para variables que posiblemente contengan decimales. Esto incluye alturas calculadas a partir de proporciones. Siempre puedes convertir a int más tarde si eso es un problema.


Nunca lanzar para flotar, tiene incluso menos precisión que un entero de 32 bits. Si va a usar punto flotante, siempre use doble en lugar de flotante.


Creo que esta es la forma más elegante de hacer esto:

Math.round(myinteger * 0.75);

Usar 0,75 en lugar de 3/4 lo convertirá implícitamente en un doble / flotante y ¿por qué no utilizar las funciones predeterminadas que se proporcionan para esto?


Las conversiones de conversión siempre son redondas así:

int height2 = Convert.ToInt32(width2 * height1 / (double)width1);


int height2 = ((width2 * height1 * 10) + 5) / (width1 * 10);

Antes de cualquier división entera, verifique para asegurarse de que el divisor no sea cero. También tenga en cuenta que esto supone un cociente positivo. Si es negativo, el redondeo debe ser -5, no +5.


Acabo de tropezar con esta pregunta. La respuesta de Aaron parece casi correcta para mí. Pero estoy seguro de que necesitas especificar el punto medio si tu problema es un problema del "mundo real". Entonces mi respuesta, basada en el código de Aaron, es

int height2 = (int)Math.Round(width2 * (height1 / (float)width1),MidpointRounding.AwayFromZero);

Para ver la diferencia, ejecuta ese código en la consola

Console.WriteLine((int)Math.Round(0.5)); Console.WriteLine((int)Math.Round(1.5)); Console.WriteLine((int)Math.Round(2.5)); Console.WriteLine((int)Math.Round(3.5)); Console.WriteLine((int)Math.Round(0.5, MidpointRounding.AwayFromZero)); Console.WriteLine((int)Math.Round(1.5, MidpointRounding.AwayFromZero)); Console.WriteLine((int)Math.Round(2.5, MidpointRounding.AwayFromZero)); Console.WriteLine((int)Math.Round(3.5, MidpointRounding.AwayFromZero)); Console.ReadLine();

Para más detalles, puede mirar este artículo.


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 recomendaría necesariamente 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, sí uso este truco. Entonces, en lugar de

int height2 = width2 * height1 / 4; // No rounding

Yo usaría

int height2 = (width2 * height1 + 2) / 4;

Aquí hay 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 lugar 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.


Un enfoque razonablemente eficaz si la división final será un número par y el resultado siempre será positivo es dividir por la mitad ese valor, agregar uno y dividir por dos. Si el resultado puede ser negativo, si es posible, agregue una cantidad que haga que todo sea positivo, realice el cálculo y luego reste una cantidad correspondiente después.

Si la división final será por un número impar, multiplica el numerador y el denominador por 2, luego procede como se indicó anteriormente. Por ejemplo, para calcular un * 5/7, redondeado, calcular (a*10+1)>>1 . Lo que hay que tener en cuenta es que puede necesitar ampliar sus valores a un tipo numérico más grande para evitar el desbordamiento o, si eso no es posible, subdividir la división en partes. Por ejemplo, para calcular un * 14/15, puede calcular ((a * 4/3 * 7) / 5 + 1) / 2. Ese cálculo aún puede desbordarse si a es demasiado grande, pero el rango permitido será tres veces más grande que si se hubiera evaluado sin dividir por 3 antes de la otra división. Tenga en cuenta que subdividir la operación hará que el redondeo sea ligeramente menos preciso, pero lo suficientemente cerca para muchos propósitos.