J'ai un tas d'objets Decimal. Je veux tester chacun d'eux pour voir s'il se termine par .43 . Je peux le faire en le convertissant d'abord en une chaîne:
>>> num = Decimal('1.4321')
>>> '.43' in str(num)
True
Mais cela échoue si je ne sais pas avec quelle précision le Decimal a été créé.
>>> num = Decimal('1.4300')
>>> '.43' in str(num)
True
4 Réponses :
Il sera préférable d'utiliser ici le raisonnement mathématique, en évitant le domaine float (inexact) et le domaine string (inutile). Si vous soustrayez 0.43 d'un nombre se terminant par .43 , vous devriez être laissé avec un entier, et vous pouvez vérifier cela en utilisant l'opérateur modulo % :
>>> point43 = Decimal("0.43")
>>> num = Decimal('1.43')
>>> (abs(num) - point43) % 1 == 0
True
Vous pouvez profiter de l'opérateur module comme ceci:
(L'opérateur module ici supprime la valeur entière. 32.48% 1 se transforme en 0.48 . L'absolu value la rend positive. abs (-32.48) deviendra 32.48 . Merci @wim.)
>>> num = float('1.4300') # changes input into float (removes trailing 0s automatically)
>>> round(abs(num)%1, 2) == .43 # checks if it ends with .43 with 2 decimal points
True
p >
Vrai. Je vais arranger ça.
... Je suppose que la vôtre utilise sa classe Decimal personnalisée où la mienne dit simplement non. Euh ...
J'ai essayé l'opérateur de module en python 3 et pour 1,340, il renvoie 0,3400000001 et donc, en comparant avec 0,34, il échoue. Tu sais pourquoi?
J'hésiterais à appeler cela «correct»; comparer deux float s pour l'égalité est sensible à l'erreur d'arrondi. La réponse de @ wim garantit que toutes les opérations continuent d'être effectuées sur des valeurs Decimal .
Je pense que ma réponse est susceptible d'erreurs d'arrondi. Je vais encore arrondir: |
@GeeTransit Ce n'est pas le seul problème; vous ne pouvez pas supposer que le littéral flottant 0.43 est exact en premier lieu. Regardez le résultat de Decimal (0.43) par rapport à Decimal ("0.43") pour voir le problème.
Vous pouvez convertir en chaîne puis supprimer les 0 de fin avant de vérifier comme suit.
num = Decimal('1.4300')
print(str(num).rstrip('0').endswith('.43'))
#Prints True
Vous pouvez supprimer votre chaîne de zéros
>>> num = Decimal('1.4300')
>>> str(num).strip('0').endswith('.43')
True
stackoverflow.com/q/54013614/5320906