IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

problème de décimale [Python 2.X]


Sujet :

Python

  1. #1
    Membre averti Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Points : 383
    Points
    383
    Par défaut problème de décimale
    Bonjour,

    Voilà je rencontre une problème sous python 2.7.6.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    >>> 9/4
    2
    >>> 125650429603636838/(2**53)
    13
    >>>
    Les résultats de mes divisions sont des entiers, même quand ils ne devraient pas en être.

    savez vous à quoi cela est dû ?

    Merci

  2. #2
    Membre averti Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Points : 383
    Points
    383
    Par défaut
    Petite indication supplémentaire.

    Sous Spyder je n'ai pas ce problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    >>> 9/4
    2.25
    >>> 234042163/(2**24)
    13.949999988079071
    >>>
    Mais dans le terminal, ou l'orque je lance mon script à l'aide de la commande python monscript.py j'ai le problème cité ci dessus.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    >>> 234042163/(2**24)
    13
    >>> 9/4
    2
    >>>

  3. #3
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par nekcorp Voir le message
    Les résultats de mes divisions sont des entiers, même quand ils ne devraient pas en être.
    C'est une fonctionnalité de Python2: le résultat de la division de deux entiers est un entier.
    Comme on vous l'a déjà raconté dans un autre post, on peut changer cela via:
    • from __future__ import division
    • en forcant un des opérande a être "float",
    • en utilisant Python3.


    PS: Et ce qui se passe sous la console de Spyder dépend de la configuration de Spyder...

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  4. #4
    Membre averti Avatar de nekcorp
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2006
    Messages
    592
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Décembre 2006
    Messages : 592
    Points : 383
    Points
    383
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,



    C'est une fonctionnalité de Python2: le résultat de la division de deux entiers est un entier.
    Comme on vous l'a déjà raconté dans un autre post, on peut changer cela via:
    • from __future__ import division
    • en forcant un des opérande a être "float",
    • en utilisant Python3.


    PS: Et ce qui se passe sous la console de Spyder dépend de la configuration de Spyder...

    - W
    Merci pour ta réponse et ton rappel.

    Effectivement on l'avait vu dans un autre post, mais je viens de me rendre compte que je ne l'avais pas bien compris.

    Problème résolu avec le from __future__ import division

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur banc de test
    Inscrit en
    Mai 2014
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur banc de test
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mai 2014
    Messages : 199
    Points : 482
    Points
    482
    Par défaut
    Quelques précisions: sous Python 2.x l'opérateur "/" utilise la fonction dite div et Python 3.x la fonction truediv.

    L'appel suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    from __future__ import division
    permet d'utiliser naturellement la fonction truediv comme sous Python 3.

    Dans le cas d'un gros code existant écrit sans cet appel il vaut mieux appeler ponctuellement la fonction pour éviter de changer le comportement/type de certains résultats, si des int() ou // ont été omis.

    La solution pour forcer une opération en flotant étant de convertir un des élements en flotant, tout comme on le fait en C.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    # Python 2
    assert 1/2 == 0
    assert 1.0/2 == 0.5
    assert 1/2.0 == 0.5
    assert 1/float(2) == 0.5
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    # Python 2
    import operator
    assert operator.div(1, 2) == 0 == 1/2 == 1//2.0
    assert operator.truediv(1, 2) == 0.5
     
    from __future__ import division
    assert operator.truediv(1, 2) == 0.5 == 1/2 != 1//2.0
    operator.div n'existe plus sous Python 3.

    Pour info, l'opérateur "//" se comporte de la même façon sous Python 2 et 3, c'est la fonction operator.floordiv, qui peut renvoyer du int() comme du float().

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    # Python 2 & 3
    assert 1.0//2 == 0.0
    assert isinstance(1.0//2, float)
    assert isinstance(1//2, int)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Conception] Problème de décimales Access>PHP
    Par LadyArwen dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 04/01/2006, 15h47
  2. [FLASH MX2004] Problème de décimales
    Par stip dans le forum Flash
    Réponses: 3
    Dernier message: 15/07/2005, 23h45
  3. [FLASH MX] Problème de décimale avec euro
    Par yoda_style dans le forum Flash
    Réponses: 7
    Dernier message: 21/05/2005, 04h14
  4. [CR8] Problème de décimales avec Centura
    Par ccquick dans le forum SAP Crystal Reports
    Réponses: 13
    Dernier message: 05/10/2004, 10h46
  5. Petit problème de décimales !
    Par ridan dans le forum Langage SQL
    Réponses: 5
    Dernier message: 11/09/2004, 21h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo