Python flottant nombre de point de comparaison

Je suis juste revoir quelques notions de base de Python et il y a un problème épineux sujet de la comparaison des nombres à virgule flottante.

2.2 * 3.0 == 6.6
3.3 * 2.0 == 6.6

Je pensais que ceux-ci devraient à la fois le retour d'un Faux. Cependant, la deuxième on m'a donné un Vrai.
Python flottant nombre de point de comparaison

Merci de m'aider ici. Merci!

Vous ne serez jamais comparer deux nombres réels par ==. Utilisation abs(a-b) < Threshold si vous le voulez vraiment.
Une bonne comparaison est plus compliqué que cela, puisque la précision de chars est un certain nombre de chiffres, pas d'une absolue valeur numérique. Quelque chose comme abs(a-b) <= rel_prec * max(abs(a), abs(b)) est mieux (avec rel_prec près de 1e-16, par exemple, pour Python double précision flotteurs). En plus de cela, le cas d'une valeur de zéro doit être manipulé trop. Je n'ai pas pleinement le vérifier, mais ce qui suit peut fonctionner: abs(a-b) <= rel_prec * (max(abs(a), abs(b)) if a != 0 != b else 1).
Hein? Vous pouvez comparer deux nombres en virgule flottante pour l'égalité à l'aide de ==. Il fonctionne correctement.
Non, Steve a dit "de ne pas utiliser == pour comparer deux nombres à virgule flottante." C'est horrible de conseils et applique injustifiée superstitions.
Et quand est-ce? Presque toujours, quand vous pensez que vous voulez vérifier l'égalité de nombres à virgule flottante, vous vous trompez, et vous n'avez pas. Si vous êtes dans une situation où vous avez vraiment vous voulez vérifier, vous savez mieux. Steve conseils n'est pas de la superstition ou nuisible; c'est une règle de base que les gens devraient suivre jusqu'à ce qu'ils exécutent dans une situation où ils disent, "tiens, ici, j'ai vraiment soin sur les N bits fraction binaire" (ou "... à propos de la séquence de bits" ou quoi que ce soit), à quel point ils vont comprendre que les règles ont des exceptions.

OriginalL'auteur Zhiya | 2014-09-29