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 :

retourner la partie décimale d'un float


Sujet :

Python

  1. #1
    Membre régulier
    Profil pro
    informatique
    Inscrit en
    Novembre 2009
    Messages
    167
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : informatique

    Informations forums :
    Inscription : Novembre 2009
    Messages : 167
    Points : 88
    Points
    88
    Par défaut retourner la partie décimale d'un float
    Bonjour à tous , je cherche a avoir une méthode prés-définie qui me retourne la partie décimal.
    merci

  2. #2
    Membre éprouvé

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    654
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 654
    Points : 1 150
    Points
    1 150
    Par défaut
    Salut,

    Tu peux passer par "modulo" comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    nb = 2.051
    print nb%1
    >>> 0.051
    Ciao

    Ju

  3. #3
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Il n'y aura pas un problème de précision ? Tu as testé Julien N ?
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  4. #4
    Membre éprouvé

    Homme Profil pro
    Ingénieur
    Inscrit en
    Août 2010
    Messages
    654
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2010
    Messages : 654
    Points : 1 150
    Points
    1 150
    Par défaut
    Salut Fred1599,

    Oui j'ai testé avant et ça marche bien, du moins avec l'exemple donné. Mais c'est peut-être pas ce que le PO souhaitais.

    Ju

  5. #5
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Python 2.x

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> nb = 2.051
    >>> print nb%1
    0.051
    Python 3.x

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    >>> nb = 2.051
    >>> print(nb%1)
    0.051000000000000156
    En effet en python 2 ça fonctionne mais pas avec la version 3...
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  6. #6
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Salut,

    Ce qui change avec Python3 c'est la précision affichée par "print" mais pas le nombre lui même:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ActivePython 2.7.2.5 (ActiveState Software Inc.) based on
    Python 2.7.2 (default, Jun 24 2011, 12:21:10) [MSC v.1500 32
    32
    Type "help", "copyright", "credits" or "license" for more inf
    >>> f = 2.051
    >>> '%.20f' % f
    '2.05100000000000015632'
    >>> f
    2.051
    >>>
    Pour le reste, il n'y a pas de fonction dans la libc qui retourne la partie décimale d'un nombre.
    C'est "normal" vu la représentation des "float" plutot orientés calculs "scientifiques".
    C'est em... lorsqu'on fait de la comptabilité mais dans ce cas on n'utilise pas des "float" mais plutôt Decimal ou autre.

    Dommage de passer par modulo pour retourner çà: une soustraction serait plus rapide (mais un peu plus compliquée car il faut faire attention au signe).

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

  7. #7
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Salut Wiztricks,

    C'est em... lorsqu'on fait de la comptabilité mais dans ce cas on n'utilise pas des "float" mais plutôt Decimal ou autre.
    Évidemment j'avais déjà testé tout cela et je m'attendais à cette réponse

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> from decimal import Decimal
    >>> nb = Decimal(nb)
    >>> nb - int(nb)
    Decimal('0.05100000000000015631940186722')
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  8. #8
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Ce que tu peux faire c'est ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #import math
    ton_nombre=ton_nombre-math.floor(ton_nombre)
    La fonction floor(x) renvoie la partie réelle de x. Du coup, en soustrayant la partie réelle tu obtiens la partie décimale de ton nombre ! Voila voila !

  9. #9
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Non toujours pas, et celle-ci aussi je l'avais prévu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> nb = 2.051
    >>> n = nb - floor(nb)
    >>> n
    0.051000000000000156
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Non toujours pas, et celle-ci aussi je l'avais prévu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> nb = 2.051
    >>> n = nb - floor(nb)
    >>> n
    0.051000000000000156
    Que cherches-tu a démontrer?

    Citation Envoyé par YoannDqr
    La fonction floor(x) renvoie la partie réelle de x. Du coup, en soustrayant la partie réelle tu obtiens la partie décimale de ton nombre ! Voila voila !
    Ouais mais çà ne fait que la moitié du boulot.
    Pour l'autre moitié, il faut mettre ceil à contribution.

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

  11. #11
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Que cherches-tu a démontrer?
    Que l'imprécision sur des float, ne permet pas d'avoir la valeur de la partie décimale de cette façon.

    La seule solution est d'utiliser les chaînes de caractères.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    def getDecimal(nb):
        if isinstance(nb, int):
            dec = 0
        elif isinstance(nb, float):
            nb = str(nb)
            ent, dec = nb.split('.')
            dec = '0.' + dec
            dec = float(dec)
        else:
            dec = None
        return dec
     
    values = (5, 2.51, "another")
     
    for val in values:
        print(getDecimal(val))
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    fred1599@fred1599-Aspire-5741G:~$ python3 test.py 
    0
    0.51
    None
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  12. #12
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 287
    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 287
    Points : 36 776
    Points
    36 776
    Par défaut
    Citation Envoyé par fred1599 Voir le message
    Que l'imprécision sur des float, ne permet pas d'avoir la valeur de la partie décimale de cette façon.

    La seule solution est d'utiliser les chaînes de caractères.
    Applique ton code au même contre-exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    >> def getDecimal(nb):
    ...     if isinstance(nb, int):
    ...         dec = 0
    ...     elif isinstance(nb, float):
    ...         nb = str(nb)
    ...         ent, dec = nb.split('.')
    ...         dec = '0.' + dec
    ...         dec = float(dec)
    ...     else:
    ...         dec = None
    ...     return dec
    ...
    >>> getDecimal(2.51-2)
    0.5099999999999998
    >>>
    Ta "solution" ne fonctionne pas.
    Par contre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    >>> print ('%.2f' % (2.51 - 2))
    0.51
    >>> print ('%.2f' % (2.51 - 2))
    0.51
    >>> print ('%.3f' % (2.51 - 2))
    0.510
    >>> print ('%.5f' % (2.51 - 2))
    0.51000
    >>> print ('%.23f' % (2.51 - 2))
    0.50999999999999978683718
    >>>
    Autrement dit la différence entre 0.51 et 0.50999999999 est un epsilon qu'il faut de toute façon gérer lorsqu'on s'amuse avec des "float".

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

  13. #13
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 823
    Points : 7 119
    Points
    7 119
    Par défaut
    En effet, il ne doit pas y avoir grand chose à faire, que de se faire une raison...
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  14. #14
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 23
    Points : 25
    Points
    25
    Par défaut un bête script qui fonctionne:
    nb=2.051
    ni=int(abs(nb))
    deci=nb-ni
    print(round(deci, 3))
    print(type(deci))
    deci=str(round(deci,3))
    print(str(deci))
    print(type(deci))
    ...
    0.051
    <class 'float'>
    0.051
    <class 'str'>

  15. #15
    Invité
    Invité(e)
    Par défaut
    Presque 8 ans plus tard !

    Sinon tant qu'à faire en version dégoulasse : float('0.'+str(2.051).split('.')[1])

  16. #16
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 23
    Points : 25
    Points
    25
    Par défaut
    Citation Envoyé par LeNarvalo Voir le message
    Presque 8 ans plus tard !

    Sinon tant qu'à faire en version dégoulasse : float('0.'+str(2.051).split('.')[1])

    Parfaitement pythonesque !

  17. #17
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par DocGyn Voir le message

    Parfaitement pythonesque !
    Ah ah si tu le dis ^^

    Voici une autre solution dans le même genre, mais un peu plus jolie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> value = 2.051
    >>> v = str(value)
    >>> float(v[v.index('.'):])
    0.051

Discussions similaires

  1. Extraire la partie décimale d'un float
    Par kryptong dans le forum Débuter
    Réponses: 15
    Dernier message: 19/01/2013, 22h01
  2. Partie décimale d'un float
    Par dré kam dans le forum C
    Réponses: 33
    Dernier message: 29/06/2011, 17h01
  3. Extraire la partie décimal d'un float en c
    Par souhe_nits dans le forum Débuter
    Réponses: 5
    Dernier message: 22/03/2011, 17h15
  4. Parties entière et décimale d'un float
    Par amateurc dans le forum Ada
    Réponses: 15
    Dernier message: 31/07/2008, 20h42
  5. Réponses: 15
    Dernier message: 30/01/2008, 18h23

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