Python >> Tutoriel Python >  >> Python

Comment imprimer un flottant sans notation scientifique en Python ?

Formulation du problème

Si vous imprimez une valeur flottante en Python inférieure à 0.0001 , Python utilisera la notation scientifique pour les petits nombres tels que 1e-05 qui est l'abréviation de 1*1/10**-5 .

Voici un exemple de sortie lors de l'impression de flotteurs de plus en plus petits sur le shell. S'il y a plus de trois zéros après la virgule décimale, Python utilisera la notation scientifique :

>>> print(0.01)
0.01
>>> print(0.001)
0.001
>>> print(0.0001)
0.0001
>>> print(0.00001)
1e-05
>>> print(0.000001)
1e-06

Problème :Comment afficher les nombres de manière non scientifique ?

Voici votre désiré sortie :

>>> print(0.00001)
0.00001

Solution 1 :formatage de chaîne f

Le moyen le plus puissant consiste à utiliser les capacités de Python pour le formatage de chaîne avec des chaînes f, c'est-à-dire des types spéciaux de chaîne de formatage qui sont inclus dans f'...' . Dans une chaîne f donnée, vous pouvez utiliser le {...:f} spécificateur de format pour indiquer à Python d'utiliser la notation à virgule flottante pour le nombre précédant le :f suffixe. Ainsi, pour imprimer le nombre my_float = 0.00001 de manière non scientifique, utilisez l'expression print(f'{my_float:f}') .

my_float = 0.00001
print(f'{my_float:f}')
# 0.000010

Le problème avec cette approche est que si vous l'essayez pour des nombres plus petits, elle n'affiche que '0' chiffres car la précision par défaut est constante :

my_float = 0.0000001
print(f'{my_float:f}')
# 0.000000

La précision :f par défaut génère une chaîne de neuf caractères (y compris la virgule flottante). Si la valeur flottante ne peut pas être représentée dans les neuf caractères, la représentation sous forme de chaîne du flottant sera coupée. Ce n'est clairement pas ce que vous voulez !

Solution 2 :formatage f-String avec précision

La meilleure façon d'imprimer même de petits nombres flottants est d'utiliser des chaînes f, c'est-à-dire des types spéciaux de chaîne de formatage qui sont enfermés dans f'...' . Dans une chaîne f donnée, vous pouvez utiliser le {...:.12f} spécificateur de format pour dire à Python d'utiliser une précision en virgule flottante avec 12 chiffres après la virgule décimale. Ainsi, pour imprimer le nombre my_float = 0.0000001 non scientifique avec 14 chiffres décimaux, utilisez l'expression print(f'{my_float:.14f}') .

my_float = 0.00001
print(f'{my_float:.14f}')
# 0.00001000000000

Et avec 8 chiffres :

my_float = 0.00001
print(f'{my_float:.8f}')
# 0.00001000

N'hésitez pas à regarder mon court tutoriel vidéo sur les f-strings et l'alternative string.format() fonction ici :

Cependant, si vous souhaitez supprimer automatiquement le '0' de fin chiffres, cette méthode ne vous aidera pas :

Solution 3 :NumPy format_float_positional()

Le np.format_float_positional() formate un flottant donné sous forme de chaîne décimale en utilisant la notation positionnelle non scientifique. Le premier argument est le flottant à afficher. Le trim facultatif argument lorsqu'il est défini sur '-' supprime les zéros de fin et tout point décimal de fin s'il n'est pas nécessaire.

Voici un exemple simple :

import numpy as np

my_float = 0.00001
print(np.format_float_positional(my_float, trim='-'))
# 0.00001

Appliquons cette méthode à plusieurs nombres pour voir que NumPy supprime automatiquement tous les zéros de fin. Pour plus de commodité, j'ai défini une fonction de conversion simple en utilisant la notation lambda :

>>> pretty_print = lambda x: np.format_float_positional(x, trim='-')
>>> pretty_print(0.001)
'0.001'
>>> pretty_print(0.0001)
'0.0001'
>>> pretty_print(0.00001)
'0.00001'
>>> pretty_print(0.000001)
'0.000001'
>>> pretty_print(0.0000001)
'0.0000001'
>>> pretty_print(0.00000001)
'0.00000001'

Vous pouvez regarder la vidéo de présentation de la fonction lambda ici :