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.
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.
Respostas:
'%f' % (x/y)
mas você precisa gerenciar a precisão você mesmo. por exemplo,
'%f' % (1/10**8)
exibirá apenas zeros.
detalhes estão nos documentos
Ou para Python 3 a formatação antiga equivalente ou a formatação de estilo mais recente
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'
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'
f"{a:.{precision}f}"
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)
>>> print('{:f}'.format(0.000000123))
0.000000
'{0:.10f}'
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
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='-')
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
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
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'
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}
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]))
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 precision
cálculo é garantir que tenhamos precisão suficiente para manter fora da notação científica (a precisão padrão ainda é 6).
O dec_precision
argumento adiciona precisão adicional a ser usada para pontos decimais. Como isso faz uso do n
formato, nenhum zeros insignificante será adicionado (diferente dos f
formatos). n
também cuidará de renderizar números inteiros já redondos sem um decimal.
n
requer float
entrada, portanto, o elenco.