Converta o número do ponto flutuante em uma certa precisão e copie para a string


144

Eu tenho um número de ponto flutuante, digamos 135.12345678910. Eu quero concatenar esse valor para uma string, mas só quero 135.123456789. Com a impressão, posso fazer isso facilmente fazendo algo como:

print "%.9f" % numvar

por numvarser meu número original. Existe uma maneira fácil de fazer isso?


3
% Faz exatamente esse -% não é parte da função de impressão, mas de string - ver docs Python
michael_s

Respostas:


177

Com Python <3 (por exemplo, 2.6 [veja comentários] ou 2.7), existem duas maneiras de fazer isso.

# Option one
older_method_string = "%.9f" % numvar

# Option two
newer_method_string = "{:.9f}".format(numvar)

Mas observe que para versões do Python acima de 3 (por exemplo, 3.2 ou 3.3), a opção dois é preferida .

Para obter mais informações sobre a opção dois, sugiro este link sobre formatação de string na documentação do Python .

E para obter mais informações sobre a opção um, esse link será suficiente e terá informações sobre os vários sinalizadores .

O Python 3.6 (lançado oficialmente em dezembro de 2016), adicionou a fstring literal, veja mais informações aqui , que estendem o str.formatmétodo (uso de chaves de forma a f"{numvar:.9f}"resolver o problema original), ou seja,

# Option 3 (versions 3.6 and higher)
newest_method_string = f"{numvar:.9f}"

resolve o problema. Confira a resposta de @ Or-Duan para obter mais informações, mas esse método é rápido .


1
a opção dois deve ser newer_method_string = "{:.9f}".format(numvar)- observe o necessário :para separar o campo e a formatação. Eu testei isso no 2.7.5 de qualquer maneira.
Caltor

1
Para o python 2.6, a opção dois deve ser newer_method_string = "{0:.9f}".format(numvar)- observe o 0 necessário para o field_name para esta versão mais antiga.
Ttq 26/10/16

56

Python 3.6

Apenas para esclarecer, você pode usar a formatação de f-string . Isso tem quase a mesma sintaxe que o formatmétodo, mas o torna um pouco melhor.

Exemplo:

print(f'{numvar:.9f}')

Mais informações sobre a nova string f:

Aqui está um diagrama dos tempos de execução dos vários métodos testados (do último link acima):

tempos de execução


52

Usando round:

>>> numvar = 135.12345678910
>>> str(round(numvar, 9))
'135.123456789'

8

Não é a impressão que faz a formatação, é uma propriedade de strings, então você pode simplesmente usar

newstring = "%.9f" % numvar

Ou use a nova formatação de estilo. valueString = "{:. 9f}". formato (número)
Zaren 7/03/13

8

Caso a precisão não seja conhecida até o tempo de execução, essa outra opção de formatação é útil:

>>> n = 9
>>> '%.*f' % (n, numvar)
'135.123456789'

3
Se você preferir usar .format-method, nota que este também pode ser feito por argumentos de nidificação assim: '{:.{n}f}'.format(numvar,n=n).
Nivk 29/10

2

Para definir a precisão com 9 dígitos, obtenha:

print "%.9f" % numvar

Precisão de retorno com 2 dígitos:

print "%.2f" % numvar 

Precisão de retorno com 2 dígitos e valor convertido flutuante:

numvar = 4.2345
print float("%.2f" % numvar) 

-2

A strfunção tem um erro. Por favor, tente o seguinte. Você verá '0,196553', mas a saída correta é '0,196554'. Porque o strvalor padrão da função é ROUND_HALF_UP.

>>> value=0.196553500000 
>>> str("%f" % value).replace(".", ",")

2
O que há com .vs. ,? E como isso é relevante para a pergunta de pauliwago?
Peter Mortensen
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.