Estoy usando un findbugs en un script ANT y no puedo encontrar la manera de corregir dos de mis errores. He leído la documentación, pero no entiendo. Aquí están mis errores y el código que los acompaña:Prueba de igualdad de coma flotante. (FE_FLOATING_POINT_EQUALITY)
Error 1: prueba de igualdad de coma flotante. (FE_FLOATING_POINT_EQUALITY)
private boolean equals(final Quantity other) {
return this.mAmount == convertedAmount(other);
}
error 2: EQ_COMPARETO_USE_OBJECT_EQUALS
public final int compareTo(final Object other) {
return this.description().compareTo(((Decision) other).description());
}
he leído la documentación para la emisión ComparesTo que indica
Es muy recomendable, pero no es estrictamente necesario que (x.compareTo (y) == 0) == (x.equals (y)). En términos generales, cualquier clase que implemente la interfaz Comparable y viole esta condición debe indicar claramente este hecho. El lenguaje recomendado es "Nota: esta clase tiene un orden natural que es inconsistente con los iguales".
y también los documentos relativos a la igualdad de punto flotante
Esta operación compara dos valores de coma flotante por la igualdad. Debido a que los cálculos de coma flotante pueden implicar el redondeo, los valores flotantes y dobles calculados pueden no ser precisos. Para valores que deben ser precisos, como valores monetarios, considere usar un tipo de precisión fija como BigDecimal. Para valores que no necesitan ser precisos, considere comparar para igualdad dentro de algún rango, por ejemplo: if (Math.abs (x - y) < .0000001). Consulte la Especificación del lenguaje Java, sección 4.2.4.
No lo consigo. Alguien puede ayudarme porfavor?
Un método 'equals' debe ser transitiva (http://javarevisited.blogspot.fr/2011/02/ how-to-write-equals-method-in-java.html) y consistentes con el método 'hashCode'. Cuéntanos más acerca de tu implementación 'igual' como' (Math.abs (this.mAmount - convertedAmount (other))
@PascalCuoq ¿ha resuelto esto? Una forma en que puedo pensar es convertir flotante a BigDecimal, redondear a la precisión que necesita y calcular el hash para eso. Pero habrá un impacto en el rendimiento. –
@AlexanderMalakhov No soy la persona que hizo la pregunta. Solo hice un comentario acerca de la conveniencia de definir un método "igual" no transitivo. No hay problema para "resolver" aquí. Los valores de punto flotante se pueden aplicar a hash y se pueden comparar por igualdad con los operadores básicos que Java ya ofrece. Cualquiera que defina un método 'igual' no-transitivo se está creando un problema por sí mismo, y la forma más simple de resolver el problema es no crearlo en primer lugar. –