Como imprimir um valor percentual em python?

183

este é o meu código:

print str(float(1/3))+'%'

e isso mostra:

0.0%

mas eu quero pegar 33%

O que eu posso fazer?

zjm1126
fonte
11
int / int = int, int / = flutuador flutuar, flaot / int = flutuador
AbiusX
3
Porcentagem significa por cem . Se você possui uma proporção simples ( 1/3no seu caso), possui um valor por unidade que deve ser multiplicado 100para obter um valor percentual . Veja as outras respostas para a diferença entre a divisão inteira e a flutuação.
Apalala 16/03
FWIW, no Python 3.x print(str(float(1/3))+'%')será impresso 0.3333333333333333%- ainda não exatamente o que você deseja, mas pelo menos está um pouco mais perto. Isso ocorre porque a divisão funciona de maneira diferente nessa versão.
martineau

Respostas:

279

formatsuporta um tipo de precisão de ponto flutuante de porcentagem :

>>> print "{0:.0%}".format(1./3)
33%

Se você não deseja uma divisão inteira, pode importar a divisão do Python3 de __future__:

>>> from __future__ import division
>>> 1 / 3
0.3333333333333333

# The above 33% example would could now be written without the explicit
# float conversion:
>>> print "{0:.0f}%".format(1/3 * 100)
33%

# Or even shorter using the format mini language:
>>> print "{:.0%}".format(1/3)
33%
miku
fonte
4
É float(1)realmente mais pitônico do que 1.?
21413 Tobias Kienzler
@TobiasKienzler, eu não sei, se é mais pitônico. Pelo menos é algo que você tropeça ao ler o código. Eu acho que com Python 3 e divisão real por padrão essa irritação se foi.
Miku
De fato. Eu me pergunto por Guido não implementar uma divisão real desde o início ... Arredondamento 1/3 a 0 deve ser explícita depois de tudo ...
Tobias KIENZLER
1
@TobiasKienzler Provavelmente porque em épocas anteriores, o Python estava mais próximo do C do que atualmente.
glglgl
14
No Python 2, eu usaria em 1.0vez de float(1)ou 1.. IMHO é menos intrusivo que o anterior e não tão sutil quanto o último.
MestreLion
175

Existe uma opção de formatação 'percentual' muito mais conveniente para o .format()método de formato:

>>> '{:.1%}'.format(1/3.0)
'33.3%'

fonte
4
Existe uma maneira de fazer isso com a "%.1f"formatação da velha escola ?
Yuji 'Tomita' Tomita
1
Um pouco "menos conveniente", mas sim! Como sugerido acimaprint("%.1f%%" % (100 * 1.0/3))
12
Essa é a melhor resposta, pois não requer multiplicação por 100. Em vez disso, aproveita o fato de que formatjá sabe imprimir porcentagens!
blambert
5
Essa deve ser a resposta aceita. Isso é muito mais Pythonic, usando recursos internos para eliminar os detalhes de implementação sem sentido que uma multiplicação por 100 seria.
Ksadowski # 28/17
2
então no estilo string-f seráf"{1/3.0:.1%}"
Kubas
66

Apenas por uma questão de integridade, já que notei que ninguém sugeriu essa abordagem simples:

>>> print("%.0f%%" % (100 * 1.0/3))
33%

Detalhes:

  • %.0fsignifica " imprimir uma bóia com 0 casas decimais ", então %.2fimprimiria33.33
  • %%imprime um literal %. Um pouco mais limpo que o original+'%'
  • 1.0em vez de 1cuidar de obrigar a divisão a flutuar, então não mais0.0
MestreLion
fonte
1
note: 100.0 * 1/3 -> ok, 100.0 * (1/3) -> 0.0 não ok
mpgn
@martialdidit: Estou ciente disso, é por isso que minha resposta não tem parênteses 1/3. A ordem de avaliação é intencional:100.0 * 1 / 3 => 100.0 / 3 => 0.33...
MestreLion 14/02
De qualquer forma, mudei a coerção de um 100para o outro 1, para deixar as coisas claras.
MestreLion 14/02
2
Desculpe, @RuggeroTurra? Isso é formatação, no sentido amplo de transformar uma entrada para exibir como uma sequência. Observe que o OP nunca exigiu o uso de .format(), e %-formatting, também conhecida como interpolação de strings no Python, é uma alternativa perfeitamente válida.
MestreLion 21/11
Com% você está formatando um float para uma string. Não é uma flutuação para uma string de porcentagem. A multiplicação por 100 é feita à mão, não pela%. Eu acho que a única solução correta que só usa a formatação é com {: 0,0%}
Ruggero Turra
38

Você está dividindo números inteiros e convertendo em flutuante. Divida por carros alegóricos.

Como bônus, use os incríveis métodos de formatação de string descritos aqui: http://docs.python.org/library/string.html#format-specification-mini-language

Para especificar uma porcentagem de conversão e precisão.

>>> float(1) / float(3)
[Out] 0.33333333333333331

>>> 1.0/3.0
[Out] 0.33333333333333331

>>> '{0:.0%}'.format(1.0/3.0) # use string formatting to specify precision
[Out] '33%'

>>> '{percent:.2%}'.format(percent=1.0/3.0)
[Out] '33.33%'

Uma ótima jóia!

Tomita, Yuji Tomita
fonte
18

Apenas para adicionar a solução de string f Python 3

prob = 1.0/3.0
print(f"{prob:.0%}")
menrfa
fonte
4

Em seguida, você deseja fazer isso:

print str(int(1.0/3.0*100))+'%'

Ele os .0denota como flutuadores e os int()arredonda para números inteiros depois novamente.

Morten Kristensen
fonte
Eu sei que isso é de 2011, mas ... int()não arredonda. por exemplo int(1.9) != 2. O arredondamento pode ser feito dessa maneira -round(1.9,0) == 2
possui
int()certamente não volta para baixo o número. Meu exemplo faz exatamente o que eu pretendia fazer; cortando os dígitos, já que era isso que o OP queria.
Morten Kristensen
O Stockoverflow é ótimo - há alguns anos e ainda é uma resposta. Obrigado. No entanto, por uma questão de exaustividade, quero esclarecer. int()derruba os dígitos. Não arredonda para baixo. O arredondamento implica que ele faz algo com os dígitos. O resultado final é o mesmo; nesse sentido, entendo o seu ponto. Além disso, o OP não esclarece o que ele / ela quer fazer com os dígitos tem 33.333 ... faz o arredondamento para 33. Obrigado por responder ao meu comentário e tenha um ótimo dia!
proprietário