Eu quero exibir:
49 Como 49.00
54.9 Como 54.90
Independentemente do comprimento do decimal ou se existem casas decimais, eu gostaria de exibir um Decimalcom 2 casas decimais e gostaria de fazê-lo de maneira eficiente. O objetivo é exibir valores monetários.
por exemplo, 4898489.00
Você precisa que seja o maior tempo possível? O que isso significa? Você pode adicionar zeros à esquerda até que você ficar sem memória, mas eu suspeito que não é o que você quer ...
Suponho que isso possa significar que o OP está usando decimal.Decimal e está insatisfeito com a precisão do contexto decimal que limita a precisão a n dígitos como em "n dígitos de precisão no sentido estrito" (por exemplo, '123.456' se torna decimal ('1.2E + 2 ')) e não "n dígitos na parte fracionária" (para Decimal (' 123.45 ')) ... Veja minha resposta para tentar ajudar com isso. ;-)
Sim, eles são para valores monetários.
Suponho que você provavelmente esteja usando os Decimal()objetos do decimalmódulo? (Se você precisar exatamente de dois dígitos de precisão além do ponto decimal com números arbitrariamente grandes, você definitivamente deveria ser, e é isso que o título da sua pergunta sugere ...)
Nesse caso, a seção Perguntas frequentes decimais dos documentos possui um par de perguntas / respostas que pode ser útil para você:
A. O método quantize () arredonda para um número fixo de casas decimais. Se a armadilha Inexact estiver definida, também será útil para validação:
P. Depois de validar duas entradas de local, como mantenho essa invariável em um aplicativo?
Se você precisar de uma resposta para isso (junto com muitas outras informações úteis), consulte a seção acima mencionada dos documentos . Além disso, se você mantiver seus Decimals com dois dígitos de precisão além do ponto decimal (significando a precisão necessária para manter todos os dígitos à esquerda do ponto decimal e dois à direita dele e não mais ...), convertê-los em strings com strfuncionará bem:
Ah, esqueci de mencionar eficiência na resposta ... mas acho que não sou especialista de qualquer maneira. Não vejo razão para que seja particularmente ineficiente manter um número fixo de "dígitos fracionários" por perto - embora qualquer operação executada nos números possa exigir uma operação de arredondamento no resultado para alinhar os requisitos ... eficiência, isso provavelmente deve ser feito com a menor frequência possível - como antes da serialização / impressão para o usuário.
Você deve usar as novas especificações de formato para definir como seu valor deve ser representado:
A documentação pode ser um pouco obtusa às vezes, por isso recomendo as seguintes referências legíveis e mais fáceis:
o Python String Format Cookbook : mostra exemplos da nova .format()formatação de string de estilo
pyformat.info : compara a %formatação de string no estilo antigo com a .format()formatação de string no estilo novo
O Python 3.6 introduziu a interpolação literal de strings (também conhecida como strings-f), agora você pode escrever o texto acima ainda mais sucinto como:
— BioGeek
@Droogans: Euh ... formatretorna um str, não um float: print type({0:.2f}".format(pi))retorna <type 'str'>.
Opa Verbo sobrecarregando a palavra return. Mude mentalmente isso para prints.
Se você não quiser usar o espaço reservado numérico:"{:.2f}".format(pi)
O que 0:faz? Presumo que o .faz parte da cadeia de caracteres python
A seção Operações de formatação de string da documentação do Python contém a resposta que você está procurando. Em resumo:
— Travis Bradshaw
Não há necessidade de 0depois do %, e não há necessidade de envolver numum tuple.
Na verdade, quebra automática de num em uma tupla é uma convenção de codificação para evitar um erro de digitação de pato nos argumentos durante a formatação da string. Nesse caso, não tem nenhum efeito com uma conversão flutuante, mas evita um erro inesperado de tipo ao converter para seqüências de caracteres. Considere r = 1; "%s" % r; r = (1, 2); "%s" % rversus r = 1; "%s" % (r,); r = (1,2 ); "%s" % (r,). Como tal, os estilos de codificação mais sofisticados do python usam a tupla incondicional agora (e o Python 3 reprovou todo o método de formatação de strings como propenso a erros).
Além disso, como um cara com formação em matemática, a notação decimal "nua" é feia. O 0 principal não faz mal a nada e parece melhor. :)
Esteticamente não é diferente. Mais importante ainda, o 0 é o valor padrão. Não há absolutamente nenhum mal em fornecer o padrão, se criar um código esteticamente agradável. É interessante quantos desenvolvedores optam por não diferenciar entre correção e estilo. : /
— Travis Bradshaw /
Você pode usar o operador de formatação de string da seguinte maneira:
Não sei ao certo o que você quer dizer com "eficiente" - esse certamente não é o gargalo do seu aplicativo. Se o seu programa estiver sendo executado lentamente, analise-o primeiro para encontrar os pontos de acesso e depois otimize-os.
Eu acho que a variável chamada 'f' pode confundir algumas pessoas. Melhor chamar de outra coisa para um exemplo como Travis abaixo.