Problema con metodo Equal para tipos double.

11/03/2005 - 11:34 por Kiko Llan | Informe spam
Hola,

Estoy teniendo problemas para comprender los resultados
del metodo equal (operador ==) sobre tipos double. A
continuación incluyo un codigo sencillo de ejemplo:

[STAThread]
static void Main(string[] args)
{
double a1=1;
double b1=-1.1;
Console.WriteLine(a1+b1);
Console.WriteLine(-0.1);
Console.WriteLine(-0.1==a1+b1); //sentencia 1
Console.WriteLine((-0.1-a1-b1)==0); //sentencia 2
}

Resultados por consola:
-0,1
-0,1
False
True

Esperaba que la sentencia 1 diese como resultado true,
pero no es asi. En cambio, la sentencia 2 si que resulta
cierta.

¿Cual es el problema? ¿Como debo interpretar el operador
==?. He hecho pruebas mostrando los HashCode y se obtienen
los mismo resultados.

Muchas gracias de antemano,

Kiko
 

Leer las respuestas

#1 A.Poblacion
11/03/2005 - 18:08 | Informe spam
"Kiko Llan" wrote in message
news:5c4501c52625$f9423b80$
Estoy teniendo problemas para comprender los resultados
del metodo equal (operador ==) sobre tipos double.
[...]
Esperaba que la sentencia 1 diese como resultado true,
pero no es asi. En cambio, la sentencia 2 si que resulta
cierta.
¿Cual es el problema? ¿Como debo interpretar el operador
==?



El problema es que los números de coma flotante (float o double) no son
exactos, sino aproximaciones. Por ejemplo, puede que tú le introduzcas a un
double el valor 0.3 y el sistema lo almacene como 0.299999999999999999.
Cuando lo visualizas te redondea los decimales y aparenta ser 0.3, pero el
valor binario que hay dentro no es el que piensas. En cuanto haces
operaciones aritméticas con ellos, estos errores se van generando y
acumulando internamente, de forma que cuando comparas el resultado final, no
tiene el valor exacto que esperabas.

¿El remedio? Primera alternativa: No usar nunca el operador == entre
"float" o "double". Si necesitas aritmética exacta, usa el tipo "decimal".
Segunda alternativa:
double a=.., b=...;
if (a==b) ... //Esto puede dar resultados inesperados.
if (Math.Abs(a-b)<0.000000001) ... //Esto funcionará razonablemente bien
si pones una constante adecuada.

Preguntas similares