J'utilise un findbugs dans un script ANT et je n'arrive pas à résoudre deux de mes erreurs. J'ai lu la documentation, mais je ne comprends pas. Voici mes erreurs et le code qui les accompagne:Test d'égalité à virgule flottante. (FE_FLOATING_POINT_EQUALITY)
Erreur 1: test d'égalité à virgule flottante. (FE_FLOATING_POINT_EQUALITY)
private boolean equals(final Quantity other) {
return this.mAmount == convertedAmount(other);
}
Erreur 2: EQ_COMPARETO_USE_OBJECT_EQUALS
public final int compareTo(final Object other) {
return this.description().compareTo(((Decision) other).description());
}
J'ai lu la documentation de la question de ComparesTo qui indique
Il est fortement recommandé, mais pas strictement nécessaire que (x.compareTo (y) == 0) == (x.équals (y)). D'une manière générale, toute classe qui implémente l'interface Comparable et viole cette condition devrait clairement indiquer ce fait. La langue recommandée est "Note: cette classe a un ordre naturel qui est incompatible avec des égaux."
et aussi la documentation en ce qui concerne le point flottant égalité
Cette opération compare deux valeurs à virgule flottante pour l'égalité. Étant donné que les calculs en virgule flottante peuvent impliquer un arrondi, les valeurs flottantes calculées et les valeurs doubles peuvent ne pas être précises. Pour les valeurs qui doivent être précises, telles que les valeurs monétaires, pensez à utiliser un type de précision fixe tel que BigDecimal. Pour les valeurs qui n'ont pas besoin d'être précises, pensez à comparer l'égalité dans une certaine plage, par exemple: if (Math.abs (x - y) < .0000001). Voir la spécification du langage Java, section 4.2.4.
Je ne comprends pas. quelqu'un peut-il aider s'il vous plait?
Une méthode 'equals' doit être transitive (http://javarevisited.blogspot.fr/2011/02/ how-to-write-equals-method-in-java.html) et cohérent avec la méthode 'hashCode'. Dites-nous en plus sur votre implémentation 'equals' comme' (Math.abs (this.mAmount - convertedAmount (other))
@PascalCuoq avez-vous résolu cela? Une façon dont je peux penser est de convertir float en BigDecimal, rond à la précision dont vous avez besoin et calculer le hachage pour cela. Mais il y aura un impact sur les performances. –
@AlexanderMalakhov Je ne suis pas la personne qui a posé la question. J'ai seulement fait un commentaire sur la pertinence de définir une méthode «égale» non-transitive. Il n'y a pas de problème à "résoudre" ici. Les valeurs à virgule flottante peuvent être hachées, et peuvent être comparées pour l'égalité avec les opérateurs de base que Java offre déjà. Toute personne qui définit une méthode 'equals' non transitive crée un problème pour elle-même, et le moyen le plus simple de résoudre le problème est de ne pas le créer en premier lieu. –