J'étais en train de lancer un petit test python que j'ai écrit sur certaines données et j'ai obtenu des résultats étranges. En résumé:

priceDiff = 219.92 - 219.52
if(priceDiff >= .40):
   print "YES"
else:
   print "NO"

Le résultat est "NON"

Pourquoi 0.40 n'est pas> = .40?

2
yellowandy 17 janv. 2017 à 10:00

2 réponses

Meilleure réponse

Python offre un environnement contrôlé pour travailler avec des flottants sous la forme de " Decimal ". Il fournit plusieurs options pour contrôler / modifier l'arrondi avec la quantité d'arrondi ainsi que différentes stratégies. ( https://docs.python.org/3.5/library/decimal.html#rounding-modes ).

from decimal import Decimal, ROUND_HALF_EVEN
a = Decimal(219.92).quantize(Decimal('.01'), rounding=ROUND_HALF_EVEN)
b = Decimal(219.52).quantize(Decimal('.01'), rounding=ROUND_HALF_EVEN)
priceDiff = a - b
cmp = Decimal(0.40).quantize(Decimal('.01'), rounding=ROUND_HALF_EVEN)

if priceDiff.compare(cmp) >= 0:
    print "YES"
else:
    print "NO"

print(d)
print(d2)
print(priceDiff)
print(cmp)

À mon humble avis, c'est mieux en termes de lisibilité et de mise en œuvre de calculs sensibles à la précision par rapport à l'application. J'espère que cela t'aides

3
Anuragh27crony 17 janv. 2017 à 21:28

De la documentation

L'erreur de représentation fait référence au fait que certaines fractions décimales (la plupart, en fait) ne peuvent pas être représentées exactement comme des fractions binaires (base 2). C'est la principale raison pour laquelle Python (ou Perl, C, C ++, Java, Fortran et bien d'autres) n'affiche souvent pas le nombre décimal exact que vous attendez:

0.1 + 0.2
0.30000000000000004
3
GAVD 17 janv. 2017 à 07:12