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 :

aide affichage de type float


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2010
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 75
    Par défaut aide affichage de type float
    Bonjour à tous,

    j'ai parcouru la documentation qui parle bien des limitations du type float.

    Mais je suis un peu perdu.
    Dans mon programme, j'ai absolument besoin d'avoir une variable de type float. Le problème c'est qu'il envoi cette même variable sous la forme :
    '2.8e-07'


    exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    x = 0.00000028
    repr(x)
    '2.8e-07'
    si je tente de modifier cette valeur avec un module tel que décimal ou autre , ma variable n'est plus du type float.
    Je souhaiterais donc que lorsque je saisi un chiffre à virgule il reste tel quel dans la variable en type float.

    Je vous remercie pour tout conseils.
    Cordialement

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Tu es bien d'accord que 0.00000028 == 2.8e-07 ? C'est le même nombre représenté de 2 manières, il est inchangé. Ta question n'est-elle pas plutôt : "comment afficher mon nombre avec la notation classique (0.00000028) plutôt qu'en notation scientifique (2.8e-07)" ?

  3. #3
    Membre confirmé
    Inscrit en
    Septembre 2010
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 75
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Tu es bien d'accord que 0.00000028 == 2.8e-07 ? C'est le même nombre représenté de 2 manières, il est inchangé. Ta question n'est-elle pas plutôt : "comment afficher mon nombre avec la notation classique (0.00000028) plutôt qu'en notation scientifique (2.8e-07)" ?

    Bonjour,

    Oui c'est bien effectivement ma question je souhaite l'afficher avec la notation classique en type float
    Le problème c'est que des que je formate la sortie, la variable se transforme en str et ne reste pas en float !

  4. #4
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par tintin3158 Voir le message
    Oui c'est bien effectivement ma question je souhaite l'afficher avec la notation classique en type float
    Le problème c'est que des que je formate la sortie, la variable se transforme en str et ne reste pas en float !
    Tu as bien conscience que tout ce que tu affiches à l'écran, c'est du texte (donc des str). Ton ordinateur ne sait afficher que du texte. "0.00023", c'est du texte ; la représentation interne du nombre flottant n'est pas du tout ça.

    Je ne sais pas ce que tu fais exactement dans ton code mais afficher / formater pour afficher ne change pas ta variable !
    >>> x = 0.000003
    >>> type(x)
    <type 'float'>
    >>> '{0:f}, {0:e}'.format(x)
    '0.000003, 3.000000e-06'
    >>> type(x)
    <type 'float'>
    >>> print(x)
    3e-06
    >>> type(x)
    <type 'float'>
    >>> 

  5. #5
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Salut,

    Ce n'est pas parce que repr(x) n'affiche pas votre variable comme vous l'attendez qu'elle a changé de type: c'est toujours un "float", c'est juste son affichage (sa représentation) qui change.
    Et si l'affichage proposé par défaut ne vous convient pas, à vous de le forcer à ce que vous voulez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> x = 0.000003
    >>> '{0:f}, {0:e}'.format(x)
    '0.000003, 3.000000e-06'
    >>>
    en apprenant à utiliser le formatage des chaînes de caractères.

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

  6. #6
    Membre confirmé
    Inscrit en
    Septembre 2010
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 75
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,

    Ce n'est pas parce que repr(x) n'affiche pas votre variable comme vous l'attendez qu'elle a changé de type: c'est toujours un "float", c'est juste son affichage (sa représentation) qui change.
    Et si l'affichage proposé par défaut ne vous convient pas, à vous de le forcer à ce que vous voulez:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    >>> x = 0.000003
    >>> '{0:f}, {0:e}'.format(x)
    '0.000003, 3.000000e-06'
    >>>
    en apprenant à utiliser le formatage des chaînes de caractères.

    - W
    Bonjour,
    oui effectivement mais ça me convertir ma chaine en str. Et je souhaite la conserver en float..

    je vous remercie pour votre réponse

  7. #7
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 738
    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 738
    Par défaut
    Citation Envoyé par tintin3158 Voir le message
    oui effectivement mais ça me convertir ma chaine en str. Et je souhaite la conserver en float..
    est-ce que "x" a été changé?

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

  8. #8
    Membre confirmé
    Inscrit en
    Septembre 2010
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 75
    Par défaut solution
    En fait j'ai trouvé une solution,

    Je la poste au cas ou ça peut servir à quelqu'un:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
        def frais(self,price):
     
     
            price = float(price)#envoie les données en str je le convertie en float pour ma fonction
            from decimal import Decimal, ROUND_DOWN #perm d'arrondire décimal inférieur
            fees = 0.1#frais binance
            frais = (price * (1-0.1/100))
     
            frais = Decimal(frais)
            frais = Decimal(frais.quantize(Decimal('.01'), rounding=ROUND_DOWN))
     
            return (frais)
    Je vous remercie pour votre aide

  9. #9
    Membre chevronné
    Homme Profil pro
    Développeur banc de test
    Inscrit en
    Mai 2014
    Messages
    199
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    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
    Par défaut
    Citation Envoyé par tintin3158 Voir le message
    En fait j'ai trouvé une solution,

    Je la poste au cas ou ça peut servir à quelqu'un

    Juste une remarque d'ordre général il vaut mieux placer l'importation en début de code plutôt que dans une fonction pour éviter d'avoir à importer systématiquement à l'appel et perdre du temps.
    On peut le faire quand c'est une fonction très rarement appelée pour de la gestion d'erreur par exemple ou pour le test '__main__' dont les librairies ne sont pas nécessaires pour le reste du code mais vraiment pas plus.

    Pour vous en convaincre :

    Avec importation dans la fonction :
    Duration for 50000 loops: 4.309 s, duration per loop: 86.170 µs.


    En déplaçant l'importation au début du code :
    Duration for 50000 loops: 3.178 s, duration per loop: 63.563 µs.

    Dans cet exemple ce n'est certes pas beaucoup en absolu on perd seulement 1,131 seconde pour 50000 opérations mais ça représente tout de même 26% du temps total de la fonction.

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    from decimal import Decimal, ROUND_DOWN #perm d'arrondire décimal inférieur
     
    class Test(object): # {
     
        def frais(self,price): # {
            price = float(price)#envoie les données en str je le convertie en float pour ma fonction
            fees = 0.1#frais binance
            frais = (price * (1-0.1/100))
     
            frais = Decimal(frais)
            frais = Decimal(frais.quantize(Decimal('.01'), rounding=ROUND_DOWN))
     
            return (frais)
        # } frais
    # } Test
     
    if __name__ == '__main__': # {
        import timeit
     
        t = Test()
     
        nb_loop = int(50e3)
        duration = timeit.timeit(
            "[t.frais(i / 10) for i in range(11)]",
            setup="from __main__ import t",
            number=nb_loop,
        )
        print("Duration for {} loops: {:.03f} s, duration per loop: {:.03f} µs.".format(
            nb_loop,
            duration,
            (duration / nb_loop) * 1e6,
        ), end="\n\n")
    # } __main__

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

Discussions similaires

  1. Tracer une droite à l'aide de deux valeurs de type Float
    Par Mechatronique dans le forum OpenCV
    Réponses: 0
    Dernier message: 16/07/2015, 13h14
  2. [type float ] problème d'affichage
    Par you98 dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 14/11/2005, 08h06
  3. [C#] Affichage d'un float dans un LABEL
    Par MaxiMax dans le forum ASP.NET
    Réponses: 2
    Dernier message: 27/07/2005, 17h59
  4. Pb de formatage de champs de type float
    Par FrankyNormand dans le forum XMLRAD
    Réponses: 9
    Dernier message: 05/05/2005, 12h37
  5. [MS-SQL][ADO] précision du type FLOAT
    Par Le Lézard dans le forum Bases de données
    Réponses: 2
    Dernier message: 23/09/2004, 15h30

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