una resultado reglas redondeo redondear numeros mas funcion entero ejercicios ejemplo decimales como cercano .net vb.net math-functions

.net - resultado - redondear decimales en excel



Necesita ayuda para redondear a 2 decimales (3)

El método System.Math.Round utiliza la estructura Double , que, como han señalado otros, es propensa a errores de precisión de coma flotante. La solución simple que encontré para este problema cuando lo encontré fue usar el método System.Decimal.Round , que no sufre el mismo problema y no requiere volver a marcar las variables como decimales:

Decimal.Round(0.575, 2, MidpointRounding.AwayFromZero)

Resultado: 0.58

¿Por qué es que cuando hago lo siguiente ...

Math.Round(0.75, 1, MidpointRounding.AwayFromZero)

Me sale 0.8

pero cuando hago lo siguiente ...

Math.Round(0.575, 2, MidpointRounding.AwayFromZero)

No obtengo 0.58. En cambio, obtengo 0.57. Quiero que todo lo que tenga 5 o más se redondee, así que 0.575 debería ser 0.58.


Es causado por una falta de precisión con dobles / decimales (es decir, la función no siempre dará el resultado esperado).

Vea el siguiente enlace: MSDN en Math.Round

Aquí está la cita relevante:

Debido a la pérdida de precisión que puede resultar de representar valores decimales como números de punto flotante o realizar operaciones aritméticas en valores de punto flotante, en algunos casos el método Round (Double, Int32, MidpointRounding) puede no redondear valores de punto medio como se especifica por el parámetro mode. Esto se ilustra en el siguiente ejemplo, donde 2.135 se redondea a 2.13 en lugar de 2.14. Esto ocurre porque internamente el método multiplica el valor por 10 dígitos, y la operación de multiplicación en este caso sufre una pérdida de precisión.


El problema será que no puede representar 0.575 exactamente como un número de punto flotante binario (por ejemplo, un doble). Aunque no sé exactamente, parece que la representación más cercana probablemente sea un poco más baja, por lo que al redondear utiliza la representación verdadera y redondea hacia abajo.

Si desea evitar este problema, utilice un tipo de datos más apropiado. decimal hará lo que quieras:

Math.Round(0.575M, 2, MidpointRounding.AwayFromZero)

Resultado: 0.58

La razón por la que 0.75 hace lo correcto es que es fácil de representar en coma flotante binario ya que es simple 1/2 + 1/4 (es decir, 2 ^ -1 + 2 ^ -2). En general, cualquier suma finita de potencias de dos se puede representar en punto flotante binario. Las excepciones son cuando tus poderes de 2 abarcan un rango demasiado grande (por ejemplo, 2 ^ 100 + 2 no es exactamente representable).

Editar para agregar:

El formateo de dobles para la salida en C # podría ser de interés en términos de entender por qué es tan difícil de entender que 0.575 no es realmente 0.575. El DoubleConverter en la respuesta aceptada mostrará que 0.575 como una Cadena Exacta es 0.5749999999999999555910790149937383830547332763671875 Puede ver de esto por qué el redondeo da 0.57.