Redondeo de decimal.

15/02/2005 - 10:35 por JOSE ANTONIO | Informe spam
El metodo round de decimal, no se comporta redondeando como estamos
acostumbrados en la UE.
si el ultimo decimal a redondear es mayor o igual a 5 se suma.

7,45 = 7,4
7,44=7,4

Sin embargo el ROUND de sql server si se comporta de esta forma.

Cuando van a estandarizar el round para que los programadores no nos hagamos
la picha un lio con comportamientos diferentes en lo que debiera ser la
misma función?

Para poder redondear en c# de la misma forma que lo hacer ROUND de sql
server hay que crear una clase o metodo nuevo?


Saludos.

Preguntas similare

Leer las respuestas

#1 Gandalf
15/02/2005 - 11:37 | Informe spam
Hola, espero que te sirva:

num: es el número que quiero redondear
decimales: el número de decimales que quiero

Habría que pulir un poco más las funciones para hacerlas más robustas
public static double Round(double num,int decimales)

{

//no miro si num es negativo (-(int)((-num*multi)+0.5d))/multi;

double multi=Math.Pow(10.0d,(double)decimales);

return ((int)((num*multi)+0.5d))/multi;

}

public static decimal Round(decimal num,int decimales)

{

decimal multi=(decimal)Pow(10,decimales);

return ((long)((num*multi)+0.5m))/multi;

}

Un Saludo.
Respuesta Responder a este mensaje
#2 JOSE ANTONIO
15/02/2005 - 13:43 | Informe spam
Gracias Gandalf, es lo que buscaba.
"Gandalf" escribió en el mensaje
news:
Hola, espero que te sirva:

num: es el número que quiero redondear
decimales: el número de decimales que quiero

Habría que pulir un poco más las funciones para hacerlas más robustas
public static double Round(double num,int decimales)

{

//no miro si num es negativo (-(int)((-num*multi)+0.5d))/multi;

double multi=Math.Pow(10.0d,(double)decimales);

return ((int)((num*multi)+0.5d))/multi;

}

public static decimal Round(decimal num,int decimales)

{

decimal multi=(decimal)Pow(10,decimales);

return ((long)((num*multi)+0.5m))/multi;

}

Un Saludo.

Respuesta Responder a este mensaje
#3 Octavio Hernandez
15/02/2005 - 20:20 | Informe spam
Gandalf,

No sé si esa fórmula tuya sería correcta en el caso general. Elevar a
potencia (y de 10, que ya de por sí no se representa exactamente en
binario), luego una multiplicación... Sospechoso. Aunque probablemente para
cantidades monetarias no demasiado grandes y dos decimales puede que
funcione correctamente.
Debe haber algo mejor, ya en alguna ocasión hubo un hilo sobre esto pero he
olvidado las conclusiones :-) Volveré a investigar...

Slds - Octavio

"Gandalf" escribió en el mensaje
news:
Hola, espero que te sirva:

num: es el número que quiero redondear
decimales: el número de decimales que quiero

Habría que pulir un poco más las funciones para hacerlas más robustas
public static double Round(double num,int decimales)

{

//no miro si num es negativo (-(int)((-num*multi)+0.5d))/multi;

double multi=Math.Pow(10.0d,(double)decimales);

return ((int)((num*multi)+0.5d))/multi;

}

public static decimal Round(decimal num,int decimales)

{

decimal multi=(decimal)Pow(10,decimales);

return ((long)((num*multi)+0.5m))/multi;

}

Un Saludo.

Respuesta Responder a este mensaje
#4 Gandalf
15/02/2005 - 22:56 | Informe spam
Pues sí, es muy posible que con double falle, pero yo actualmente la estoy
usando sólo con decimal.

De todas formas, buena aclaración.

Un Saludo.
Respuesta Responder a este mensaje
#5 Vyacheslav Popov
17/02/2005 - 20:33 | Informe spam
"JOSE ANTONIO" escribió en el mensaje
news:
El metodo round de decimal, no se comporta redondeando como estamos
acostumbrados en la UE.
si el ultimo decimal a redondear es mayor o igual a 5 se suma.

7,45 = 7,4
7,44=7,4

Sin embargo el ROUND de sql server si se comporta de esta forma.

Cuando van a estandarizar el round para que los programadores no nos
hagamos la picha un lio con comportamientos diferentes en lo que debiera
ser la misma función?



La normalización IEEE 754 recomienda efectuar un redondeo al más próximo; y
si el error es igual en ambos sentidos se hace un redondeo al par, que
consiste en redondear por defecto o por exceso, pero siempre de forma que el
bit menos significativo del número resultante sea 0.


Para poder redondear en c# de la misma forma que lo hacer ROUND de sql
server hay que crear una clase o metodo nuevo?


Saludos.



Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida