recherche

Maison  >  Questions et réponses  >  le corps du texte

Problème avec eval en python

Comme le montre la figure, lorsque Python2.7 utilise eval pour calculer des expressions à virgule flottante,

eval('0.3-0.1==0.2')  # 输出为False
eval('%d - %d == %d'%(0.3, 0.1, 0.2))  # 输出为True
eval('%s - %s == %s'%(0.3, 0.1, 0.2))  # 输出为False
eval('%s - %s == %s'%('0.3', '0.1', '0.2'))  # 输出为False

C'est très déroutant. Je ne trouve pas la réponse en ligne. Veuillez me guider !


Mise à jour :

J'ai une autre question,
a=0.3-0.1, print(a) génère 0.199999999999999998 ; b=0.2,
mais print('%s==%s'%(a,b)) produit 0.2 ==0.2,
Pourquoi un changement de 0,199999999999999998 à 0,2 lors du formatage de la chaîne ?

仅有的幸福仅有的幸福2716 Il y a quelques jours1029

répondre à tous(3)je répondrai

  • phpcn_u1582

    phpcn_u15822017-06-22 11:54:25

    Ne peut généralement pas être utilisé directement dans les ordinateurs == Comparez si deux nombres à virgule flottante sont égaux.

    Parce que les valeurs à virgule flottante comportent des erreurs dans les ordinateurs.

    Python dispose de decimalfraction 2 modules pour des calculs en virgule flottante de haute précision.


    Exemple

    >>> from fractions import Fraction
    >>> Fraction('0.3')-Fraction('0.1') == Fraction('0.2')
    True
    >>> from decimal import Decimal
    >>> Decimal('0.3')-Decimal('0.1') == Decimal('0.2')
    True
    >>> 

    répondre
    0
  • 仅有的幸福

    仅有的幸福2017-06-22 11:54:25

    Cela n'a rien à voir avec eval, c'est principalement une question de précision. Cela se rencontrera dans tous les langages de programmation. Si vous essayez 0.3-0.1 == 0.2, cela renverra directement le problème Baidu JavaScript 0.2-0.1. puis jetez un œil aux "Principes de composition informatique" 》La représentation initiale des données.

    https://stackoverflow.com/que... Il s'agit d'une réponse très votée.

    répondre
    0
  • 为情所困

    为情所困2017-06-22 11:54:25

    eval('0.3-0.1==0.2')  # 输出为False, 是因为0.3-0.1=0.19999999999999998
    eval('%d - %d == %d'%(0.3, 0.1, 0.2))  # 输出为True, 是因为你%d传入是整数,相当于0-0=0
    eval('%s - %s == %s'%(0.3, 0.1, 0.2))  # 输出为False, 参考1
    eval('%s - %s == %s'%('0.3', '0.1', '0.2'))  # 输出为False, 参考1

    répondre
    0
  • Annulerrépondre