round redondear net midpointrounding hacia decimals decimales awayfromzero abajo .net vb.net rounding

.net - redondear - round double c#



Problema de redondeo.Net (5)

Tengo un problema de redondeo dentro de .Net.

Estoy redondeando un número de 3 dígitos a dos dígitos y está causando algunos problemas con un número.

Si intento redondear 34.425 a dos lugares decimales, debería redondearlo a 34.43. Estoy usando la opción roundawayfromzero y ha funcionado para todos los números del programa, excepto para este hasta ahora.

El código Math.Round(34.425, 2, MidpointRounding.AwayFromZero) debería ser igual a 34.43, sin embargo, es igual a 34.42.

Si intento esto con cualquier otro número, funciona bien.

Math.Round(34.435, 2, MidpointRounding.AwayFromZero) = 34.44 Math.Round(34.225, 2, MidpointRounding.AwayFromZero) = 34.23 Math.Round(34.465, 2, MidpointRounding.AwayFromZero) = 34.47

Solo quería comprobar si alguien había tenido este problema antes.

Por ahora, he solucionado este problema convirtiendo el número a un decimal. Cambié el código a esto y funciona bien ahora:

Math.Round(CDec(34.425), 2, MidpointRounding.AwayFromZero) = 34.43

Solo busco una razón sobre por qué mi código anterior no funcionaba.

¡Gracias!

Actualizado el código correcto AwayFromZero


El código Math.Round (34.425, 2, MidpointRounding.ToEven) debería ser igual a 34.43, sin embargo, es igual a 34.42.

¿Por qué? ToEven debe hacerlo 34.42 ya que 42 es par. El comportamiento es correcto.


El punto flotante nunca es exacto, 34.425 puede tener una represantación interna 34.4249999999999 .. que se redondeará a 34.42.

Si necesita una representación exacta de los números, utilice el tipo decimal .


Ligeramente confundido acerca de si realmente está usando MidpointRounding.ToEven o MidpointRounding.AwayFromZero . Si está utilizando ToEven como lo indica el primer fragmento, este es el comportamiento esperado.


No uso vb.net, entonces mi razonamiento puede ser incorrecto, pero basado en los nombres de sus parámetros MidpointRounding.ToEven, esperaría que 34.425 se redondee a 34.42; pero también esperaría que 34.225 se redondee a 34.22 y 34.465 a 34.46. El redondeo de números que termina en 5 como en sus ejemplos es una cuestión de convención. La convención más habitual es redonda a un número par, lo cual deduzco que su parámetro .ToIn estaría adoptando.

Además, sospecho que se encuentra con el problema de redondeo binario / decimal. Comprobar la representación binaria de 34.425 sale como 10010.011011 ....... Cuando toma en cuenta el almacenamiento de la computadora y la representación de un número decimal (byte, palabra, palabra doble, palabra cuadruple y complemento negativo / positivo), esto puede dar como resultado en ti no redondeas el número que creías que eras

Para obtener los resultados que desea, probablemente debería agregar 0.00001 a cualquier dígito que termine en 5 antes del redondeo.


Tus suposiciones y resultados son incorrectos:

Math.Round(34.225, 2, MidpointRounding.ToEven) == 34.22 Math.Round(34.465, 2, MidpointRounding.ToEven) == 34.46

y

Math.Round(34.425, 2, MidpointRounding.ToEven) == 34.42

Así es como funciona, y eso es lo que obtengo en mi caja. Redondear a par significa exactamente eso, redondeando hacia arriba o hacia abajo para llegar al siguiente número par en el lugar decimal de interés.