Como suprimir a notação científica ao imprimir valores flutuantes?

147

Aqui está o meu código:

x = 1.0
y = 100000.0    
print x/y

Meu quociente é exibido como 1.00000e-05.

Existe alguma maneira de suprimir a notação científica e torná-la exibida como 0.00001? Vou usar o resultado como uma string.

Matt
fonte
1
1/10000 = 0.0001 = 1.00000e-04
Adrian Archer
@AA, supondo que tenha sido um erro de digitação na declaração de atribuição, eu o corrigi.
Dana
É decepcionante que nenhuma das respostas aqui resolva a questão. Seria bom se houvesse uma maneira de impedir que o python (3) usasse notação científica, exceto quando especificado explicitamente. Todas as respostas exigem que o usuário suprima explicitamente a notação científica, o que não é o mesmo que suprimir o uso implícito da notação científica de dentro do python.
BLUC

Respostas:

92

Usando a versão mais recente ''.format(lembre-se de especificar quantos dígitos após o que .você deseja exibir, isso depende de quão pequeno é o número flutuante). Veja este exemplo:

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

como mostrado acima, o padrão é 6 dígitos! Isso não é útil para o nosso exemplo de caso; portanto, poderíamos usar algo como isto:

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

Atualizar

A partir do Python 3.6, isso pode ser simplificado com a nova literal de string formatada , da seguinte maneira:

>>> f'{a:.20f}'
'-0.00000000000000007186'
Aziz Alto
fonte
Como fazer isso ao especificar números significativos?
Marses 28/10/19
Eu acho que usando uma variável, forneça o número desejado de dígitos e use-o em vez do número literal, por exemplo:f"{a:.{precision}f}"
Aziz Alto
49

Com as versões mais recentes do Python (2.6 e posterior), você pode usar ''.format()para realizar o que o @SilentGhost sugeriu:

'{0:f}'.format(x/y)
nmichaels
fonte
1
É mesmo isto que queres? Eu não: >>> print('{:f}'.format(0.000000123)) 0.000000
duality_
1
@duality, pode ser necessário especificar precisão. '{0:.10f}'
Nmichaels 22/18
24

Outra opção, se você estiver usando pandas e quiser suprimir a notação científica para todos os carros alegóricos, é ajustar as opções de pandas.

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

A maioria das respostas acima exige que você especifique precisão. Mas e se você quiser exibir carros alegóricos como este, sem zeros desnecessários:

1
0.1
0.01
0.001
0.0001
0.00001
0.000001
0.000000000001

numpy tem uma resposta: np.format_float_positional

import numpy as np

def format_float(num):
    return np.format_float_positional(num, trim='-')
Dennis Golomazov
fonte
5

Isso funcionará para qualquer expoente:

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
Capitão Pepino
fonte
4

Isto está usando a resposta do capitão Pepino , mas com 2 adições.

1) permitir que a função obtenha números de notação não científicos e apenas retorne-os como estão (para que você possa fornecer muitas informações de que alguns dos números são 0,00003123 vs 3,123e-05 e ainda possuem funções funcionais.

2) suporte adicionado para números negativos. (na função original, um número negativo terminaria como 0,0000-108904 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
Finn42
fonte
3

Além da resposta da SG, você também pode usar o módulo Decimal:

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

# x is a string '0.0001'
Dana
fonte
14
ele se transforma em notação científica para valores menores que 1e-6
SilentGhost
2

Se for um string, use o interno floatpara fazer a conversão, por exemplo: print( "%.5f" % float("1.43572e-03")) answer:0.00143572

U-571
fonte
1

Como este é o melhor resultado no Google, postarei aqui depois de não encontrar uma solução para o meu problema. Se você deseja formatar o valor de exibição de um objeto flutuante e ele permanecer flutuante - e não uma string, você pode usar esta solução:

Crie uma nova classe que modifique a maneira como os valores flutuantes são exibidos.

from builtins import float
class FormattedFloat(float):

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

Você pode modificar a precisão alterando os valores inteiros em {:f}

Jared Marks
fonte
-1

Usando 3.6.4, eu estava tendo um problema semelhante que, aleatoriamente, um número no arquivo de saída seria formatado com notação científica ao usar isso:

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

Tudo o que eu tive que fazer para corrigir isso foi adicionar 'f':

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

A partir da versão 3.6 (provavelmente também funciona com a versão 3.x um pouco mais antiga), esta é a minha solução:

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')

O objetivo do precisioncálculo é garantir que tenhamos precisão suficiente para manter fora da notação científica (a precisão padrão ainda é 6).

O dec_precisionargumento adiciona precisão adicional a ser usada para pontos decimais. Como isso faz uso do nformato, nenhum zeros insignificante será adicionado (diferente dos fformatos). ntambém cuidará de renderizar números inteiros já redondos sem um decimal.

nrequer floatentrada, portanto, o elenco.

Alex S
fonte