web-dev-qa-db-fra.com

Comment supprimer la notation scientifique en Python?

Voici mon code:

x = 1.0
y = 100000.0    
print x/y

Mon quotient s'affiche sous la forme 1.00000e-05

Existe-t-il un moyen de supprimer la notation scientifique et de l’afficher sous la forme 0.00001? Je vais utiliser le résultat comme une chaîne.

100
Matt
'%f' % (x/y)

mais vous devez gérer vous-même la précision. par exemple.,

'%f' % (1/10**8)

affichera des zéros seulement.
les détails sont dans la documentation

Ou pour Python 3 l'ancien formatage équivalent _ ou le nouveau formatage de style _

46
SilentGhost

Utilisation de la version plus récente ''.format (n'oubliez pas de spécifier le nombre après le . que vous souhaitez afficher, cela dépend de la taille du nombre flottant). Voir cet exemple:

>>> a = -7.1855143557448603e-17
>>> '{:f}'.format(a)
'-0.000000'

comme indiqué ci-dessus, la valeur par défaut est 6 chiffres! Ce n'est pas utile pour notre exemple, alors nous pourrions utiliser quelque chose comme ceci:

>>> '{:.20f}'.format(a)
'-0.00000000000000007186'

Mettre à jour

À partir de Python 3.6, ceci peut être simplifié avec le nouveau littéral de chaîne formaté , comme suit:

>>> f'{a:.20f}'
'-0.00000000000000007186'
52
Aziz Alto

Avec les nouvelles versions de Python (2.6 et ultérieures), vous pouvez utiliser ''.format() pour accomplir les suggestions de @SilentGhost:

'{0:f}'.format(x/y)
45
nmichaels

Une autre option, si vous utilisez pandas et souhaitez supprimer la notation scientifique de tous les flottants, consiste à ajuster les options pandas.

import pandas as pd
pd.options.display.float_format = '{:.2f}'.format
8
Josh Janjua

Cela fonctionnera pour tout exposant:

def getExpandedScientificNotation(flt):
    str_vals = str(flt).split('e')
    coef = float(str_vals[0])
    exp = int(str_vals[1])
    return_val = ''
    if int(exp) > 0:
        return_val += str(coef).replace('.', '')
        return_val += ''.join(['0' for _ in range(0, abs(exp - len(str(coef).split('.')[1])))])
    Elif int(exp) < 0:
        return_val += '0.'
        return_val += ''.join(['0' for _ in range(0, abs(exp) - 1)])
        return_val += str(coef).replace('.', '')
    return return_val
4
Captain Cucumber

Ceci utilise La réponse du capitaine Cucumber , mais avec 2 ajouts.

1) permettant à la fonction d’obtenir des nombres de notation non scientifique et de les renvoyer tels quels (vous pouvez donc entrer beaucoup de données en indiquant que certains des nombres sont 0.00003123 vs 3.123e-05 et ont toujours un travail fonctionnel.

2) ajout du support pour les nombres négatifs. (Dans la fonction d'origine, un nombre négatif finirait par 0,0000-108904 à partir de -1.08904e-05)

def getExpandedScientificNotation(flt):
    was_neg = False
    if not ("e" in flt):
        return flt
    if flt.startswith('-'):
        flt = flt[1:]
        was_neg = True 
    str_vals = str(flt).split('e')
    coef = float(str_vals[0])
    exp = int(str_vals[1])
    return_val = ''
    if int(exp) > 0:
        return_val += str(coef).replace('.', '')
        return_val += ''.join(['0' for _ in range(0, abs(exp - len(str(coef).split('.')[1])))])
    Elif int(exp) < 0:
        return_val += '0.'
        return_val += ''.join(['0' for _ in range(0, abs(exp) - 1)])
        return_val += str(coef).replace('.', '')
    if was_neg:
        return_val='-'+return_val
    return return_val
4
Finn42

S'il s'agit d'une string, utilisez la variable intégrée float dessus pour effectuer la conversion, par exemple: print( "%.5f" % float("1.43572e-03")) Answer: 0.00143572

1
U-571

En plus de la réponse de SG, vous pouvez également utiliser le module Decimal:

from decimal import Decimal
x = str(Decimal(1) / Decimal(10000))

# x is a string '0.0001'
1
Dana

Comme il s’agit du meilleur résultat sur Google, je posterai ici après avoir échoué à trouver une solution à mon problème. Si vous souhaitez formater la valeur d'affichage d'un objet float et que celui-ci reste un float - pas une chaîne, vous pouvez utiliser cette solution:

Créez une nouvelle classe qui modifie la manière dont les valeurs flottantes sont affichées.

from builtins import float
class FormattedFloat(float):

    def __str__(self):
        return "{:.10f}".format(self).rstrip('0')

Vous pouvez modifier vous-même la précision en modifiant les valeurs entières dans {:f}

0
Jared Marks

À partir de la version 3.6 (fonctionne probablement aussi avec la version 3.x légèrement plus ancienne), voici ma solution:

import locale
locale.setlocale(locale.LC_ALL, '')

def number_format(n, dec_precision=4):
    precision = len(str(round(n))) + dec_precision
    return format(float(n), f'.{precision}n')

Le but du calcul precision est de garantir que nous avons suffisamment de précision pour rester en dehors de la notation scientifique (la précision par défaut est toujours de 6).

L'argument dec_precision ajoute une précision supplémentaire à utiliser pour les points décimaux. Étant donné que cela utilise le format n, aucun zéros non significatif ne sera ajouté (contrairement aux formats f.). n prendra également en charge le rendu des entiers déjà arrondis sans décimale.

n nécessite l'entrée float, donc la conversion.

0
Alex S

En utilisant 3.6.4, j'avais un problème similaire: au hasard, un nombre dans le fichier de sortie serait formaté avec une notation scientifique lors de l'utilisation de ceci:

fout.write('someFloats: {0:0.8},{1:0.8},{2:0.8}'.format(someFloat[0], someFloat[1], someFloat[2]))

Tout ce que je devais faire pour résoudre ce problème était d'ajouter «f»:

fout.write('someFloats: {0:0.8f},{1:0.8f},{2:0.8f}'.format(someFloat[0], someFloat[1], someFloat[2]))
0
Scott Lohr