Formatage des flottants en python

Bonjour,
avant de développer une fonction (sans doute pas très compliquée) je me demande s'il n'y a pas une solution plus immédiate pour en python, afficher un flottant avec un nombre de décimales fixé dans une variable ;
Quelqu’un a-t-il déjà été confronté à cette contrainte ?
Cordialement.

Réponses

  • >>> from math import pi
    >>> print("%.8f"%pi)
    3.14159265
    >>> print("%.6f"%pi)
    3.141593
    
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Mon problème est que dans %.8f , le nombre de décimales (8) est fixe . Moi j'ai sa valeur dans une variable (n par exemple) mais je ne connais pas cette valeur .

    Je pense qu'une fonction recevant le flottant et le nombre de décimales à afficher n'est pas très compliquée (avec floor()) par exemple .
  • >>> print("{:.{prec}f}".format(pi,prec=6))
    3.141593
    >>> print("{:.{prec}f}".format(pi,prec=9))
    3.141592654
    
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • Je me doutais qu'il devait y avoir une solution plus immédiate . Je vais tester cela avec une variable pour la précision .
    Merci nicolas.patrois pour ces réponses rapides et pertinentes .
  • Je les ai trouvées en cherchant « python format float », la première manière est obsolète, pas la dernière.
    Algebraic symbols are used when you do not know what you are talking about.
            -- Schnoebelen, Philippe
  • J'ai cherché aussi avec ces mots clés mais je ne suis jamais tombé sur cette syntaxe . Le plus détaillé que j'ai trouvé est ceci où cette syntaxe n'apparait pas explicitement .

    Mais elle donne exactement ce que je souhaitais .
    Encore un grand merci car j'ai beaucoup cherché sans trouver .
    Voila mon test :
    nb_dec = int(input ("Nombre de décimales : (0 pour quitter) "))
    nb_f = 10.6789678967896789
    
    while (nb_dec != 0) :
      print("{:.{prec}f}".format(nb_f , prec = nb_dec))
      nb_dec = int(input ("Nombre de décimales : (0 pour quitter)  "))
    

    [Python en italique ne vaut rien. Il faut la bannière code pour préserver les indentations. AD]
  • En fait, on peut utiliser la première syntaxe mentionnée dans ce fil (dite «classique», héritière du C) pour parvenir au résultat, et ce, de deux manières différentes :

    from math import pi
    
    print("%.*f" %(8,pi))
    print("%.*f" %(6, pi))
    print()
    
    for precision in [8,6]:
        print("%%.%sf" % precision %pi)
    

    qui affiche :
    3.14159265
    3.141593
    
    3.14159265
    3.141593
    



    Concernant l'autre syntaxe, elle utilise des «champs de remplacement emboîtés», c'est expliqué très laconiquement dans la doc officielle, le paragraphe commençant par "A format_spec field can also include nested replacement fields within it."

    Pour alléger la syntaxe format, il est plus agréable d'utiliser des chaînes littérales formatées (Python 3.6 au moins) :
    from math import pi
        
    precision=6
    s= f"{pi:.{precision}f}"
    print(s)
    


    mais à mon goût, la syntaxe classique * est ici plus lisible.


    La doc officielle actuelle ne considère pas la première syntaxe comme obsolète. Les premières versions de Python 3 ont tenté de la rendre explicitement telle mais cette mention a été retirée dans la doc des versions ultérieures de Python. Voir aussi des discussions sur stackOverflow.
  • toutes ces syntaxes ne sont pas facile à trouver et peu lisibles pour les non experts . Aussi j'ai préféré les cacher dans une fonction comme :
    print_float (val , precision)

    Merci en tout cas pour toutes ces informations
  • On peut mettre une indication de précision aussi élevée que l’on veut dans le formatage.
    "'%.266f' % x sortira 266 chiffres après la virgule. Mais Python fait les calculs sur la base
    des représentations internes (soit des représentations binaires des nombres) à 52 digits.
    Il y a des tutoriels si on développe dans ce langage plutôt en VOEN mais aussi en VOFR .
  • Pour illustrer ce que dit Romyna, avec le module standard decimal :

    import decimal
    
    decimal.getcontext().prec = 100
    d = decimal.Decimal(2646693125139304345)/842468587426513207
    print('{:.100}'.format(d))
    

    qui affiche :
    3.141592653589793238462643383279502884183062184016283770132773708960402899373640293814361991185808100
    

    On peut faire un formatage analogue avec le module (non standard) bigfloat.
Connectez-vous ou Inscrivez-vous pour répondre.