Java no parece estar comparando Dobles derecha
Pregunta
He creado una lista enlazada, con inserción, buscar y quitar funciones. También creé un iterador para ello. Ahora, supongamos que yo hago esto:
myList<Integer> test = new myList();
test.insert(30);
test.insert(20);
test.insert(10);
myList.iterator it = test.search(20);
if(it.hasNext())
System.out.println(it.next());
Y listo, funciona (se imprime el valor del elemento en el nodo, en este caso 20). Ahora, si hago esto:
myList<Double> test = new myList();
test.insert(30.1);
test.insert(20.1);
test.insert(10.1);
myList.iterator it = test.search(20.1);
if(it.hasNext())
System.out.println(it.next());
No lo hace, debido a que el iterador apunta a null. Aquí está la implementación de la función de búsqueda:
public iterator search(T data)
{
no<T> temp = first;
while( (temp != null) && (temp.data != data) )
temp = temp.next;
return (new iterator(temp));
}
Así es como sé que hay algo raro con las comparaciones: Si cambio de parte del código por encima de la siguiente manera:
while( (temp != null) && (temp.data != data) )
System.out.println(temp.data + " " + data);
temp = temp.next;
Lo puedo ver la impresión de los números de la lista. Imprime, en un momento dado, "20.1 20.1" (por ejemplo). Entonces, ¿cómo puedo solucionar este problema? La función parece ser correcto, pero parece como si Java no está comparando los números correctamente.
EDIT: wth, BigDecimal me dio el mismo tipo de problema también
.EDIT 2: equals () trabajaron, no se dio cuenta otra cosa no iba bien. Lo sentimos.
Solución
Usted no quiere que el operador! = Para esto. Se comapres referencias. Desea que el método .equals()
:
public iterator search(T data)
{
no<T> temp = first;
while (!data.equals(temp.data)) {
temp = temp.next;
}
return (new iterator(temp));
}
Además, cuidado con los de auto-boxing . Es posible que las cajas test.search(20.1)
20.1 a no es un Float
un Double
, lo que probablemente se romperá su comparación. Comparar los resultados con test.search(20.1d)
. Si no recuerdo mal, la expresión:
new Float(20.1).equals(new Double(20.1))
es falso.
Otros consejos
Tenga en cuenta que el uso de .equals()
Comparar duplica puede dar lugar a errores. Double.equals()
utiliza esto como su prueba de la igualdad:
d1.doubleValue() == d2.doubleValue()
Dobles y flotadores son aproximaciones de números almacenados en un espacio fijo en la memoria.
Con el fin de comparar adecuadamente números de punto flotante , es necesario tener en cuenta que debido a la naturaleza de los flotadores, habrá algún error.
Vea: http://www.google.com/search?q = flotante + punto + igualdad
Una forma rápida y fácil de comparar los dobles es utilizar Math.abs(a-b)<ACCEPTABLE_ERROR
donde ACCEPTABLE_ERROR podría .000000000001
dependiendo de qué es exactamente lo que estás haciendo.
(Nota esto no maneja casos extremos, tales como NaN y el infinito)