Redondeo a dos cifras por encima

15/07/2005 - 17:00 por Juan | Informe spam
Cordial saludo

Tengo el siguiente valor: 0.125
Necesito mostrar dicho valor redondeado a dos cifras pero de forma que me de
0.13 pues el tercer numero despues del punto es mayor que 5.
si utilizo la función round me esta dando 0.12, solo si este tercer numero
es 6 o mayor que 6 si me pone 0.13.

Muchas gracias

Preguntas similare

Leer las respuestas

#1 Eduardo A. Morcillo [MS MVP VB]
15/07/2005 - 18:45 | Informe spam
Esto se debe a que Round utiliza el redondeo bancario. Puedes utilizar esta
funcion para hacer el redondeo que quieres:

static double Redondear(double numero, int decimales) {

if (decimales < 0)
throw new ArgumentException();

double factor = Math.Pow(10, decimales);

return Math.Floor(numero * factor + .5) / factor;

}

Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo
Respuesta Responder a este mensaje
#2 Tristan
15/07/2005 - 19:09 | Informe spam
La función Round sigue el estandar IEE 754, que se basa en lo que se llama
redondeo bancario. Es el redondeo que se utiliza en estadística, puesto que
ofrece la menor desviación posible.

Pero no creas que redondea hacia abajo el 5. Redondea hacia abajo el 5
cuando la anterior cifra es par y hacia arriba cuando es impar.

Double d1 = Math.Round(0.125, 2);
Double d2 = Math.Round(0.135, 2);
MessageBox.Show(String.Format("{0} ; {1}", d1, d2));

Muestra 0,12 ; 0,14

Tal vez te parezca extraño, pero entre otras cosas así es como funciona el
redondeo del procesador.

Para cambiar este comportamiento podrías sumar una cantidad que
"desequilibre" el 5:

Double d1 = Math.Round(0.125 + 0.0001, 2);
Double d2 = Math.Round(0.135 + 0.0001, 2);

Muestra 0,13 ; 0,14

O redondear por tus propios medios:

Double d1 = (int) (0.135 * 100.0 + 0.5) / 100.0;

Por cierto, una diferencia interesante entre Convert.ToInt32() e (int) es
que convert utiliza redondeo bancario, mientras que el casting a int recorta
la parte decimal.

Juan Carlos Badiola
MVP - C#
Respuesta Responder a este mensaje
#3 Octavio Hernandez
15/07/2005 - 21:36 | Informe spam
Juan,

En la próxima versión de .NET vendrá una versión de Math.Round con un
parámetro adicional para indicar el tipo de redondeo deseado:

http://msdn2.microsoft.com/library/ms131274(en-us,vs.80).aspx

Slds - Octavio

"Juan" escribió en el mensaje
news:
Cordial saludo

Tengo el siguiente valor: 0.125
Necesito mostrar dicho valor redondeado a dos cifras pero de forma que me
de
0.13 pues el tercer numero despues del punto es mayor que 5.
si utilizo la función round me esta dando 0.12, solo si este tercer numero
es 6 o mayor que 6 si me pone 0.13.

Muchas gracias


Respuesta Responder a este mensaje
#4 Octavio Hernandez
15/07/2005 - 21:49 | Informe spam
Edu,

Esta función seguramente vale cuando 'decimales' es pequeño (2, 3), pero
como método general me parece que no valdría, entre la elevación a potencia
y la división podrían producir errores de aproximación importantes, ¿no? Y
en cualquier caso, la función será super-lenta...

Slds - Octavio

"Eduardo A. Morcillo [MS MVP VB]" <emorcillo .AT. mvps.org> escribió en el
mensaje news:%
Esto se debe a que Round utiliza el redondeo bancario. Puedes utilizar
esta funcion para hacer el redondeo que quieres:

static double Redondear(double numero, int decimales) {

if (decimales < 0)
throw new ArgumentException();

double factor = Math.Pow(10, decimales);

return Math.Floor(numero * factor + .5) / factor;

}

Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo

Respuesta Responder a este mensaje
#5 Eduardo A. Morcillo [MS MVP VB]
16/07/2005 - 04:17 | Informe spam
Esta función seguramente vale cuando 'decimales' es pequeño (2, 3),
pero como método general me parece que no valdría, entre la elevación
a potencia y la división podrían producir errores de aproximación
importantes, ¿no? Y en cualquier caso, la función será super-lenta...



La elevacion no seria problema ya que no deberiamos pasarnos de 15, que es
la precisin de un double (si, se me olvido esa comprobacion :( ). La cuenta
en si podria llegar a ser un problema si el numero es muy grande y quieres
muchos decimales porque se perderia precision en los decimales. Puede que no
sea una funcion para grande calculos matematicos pero para las aplicaciones
normales funciona perfectamente.

Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida