it-swarm-pt.tech

imprimir float em n casas decimais, incluindo zeros à direita

Preciso imprimir ou converter um número flutuante em uma sequência de 15 casas decimais, mesmo se o resultado tiver muitos 0s à direita, por exemplo:

1.6 passa a 1.6000000000000000

Tentei o round (6.2,15), mas ele retornou 6.2000000000000002 adicionando um erro de arredondamento

Eu também vi várias pessoas online que colocaram o float em uma string e adicionaram 0 à direita manualmente, mas isso parece ruim ...

Qual é a melhor maneira de fazer isso?

32
jonathan topf

Para Python nas versões 2.6+ e 3.x

Você pode usar o str.format método. Exemplos:

>>> print('{0:.16f}'.format(1.6))
1.6000000000000001

>>> print('{0:.15f}'.format(1.6))
1.600000000000000

Note o 1 no final do primeiro exemplo é erro de arredondamento; isso acontece porque a representação exata do número decimal 1.6 requer um número infinito de dígitos binários. Como os números de ponto flutuante têm um número finito de bits, o número é arredondado para um valor próximo, mas não igual.

Para Python anteriores à 2.6 (pelo menos de volta à 2.0))

Você pode usar a sintaxe "formatação de módulos" (isso funciona para Python 2.6 e 2.7 também):

>>> print '%.16f' % 1.6
1.6000000000000001

>>> print '%.15f' % 1.6
1.600000000000000
59
David Alber

Os números de ponto flutuante não têm precisão para representar com precisão "1,6" com tantas casas decimais. Os erros de arredondamento são reais. Seu número não é realmente 1,6.

Confira: http://docs.python.org/library/decimal.html

5
dkamins

Eu acho que isso é essencialmente colocá-lo em uma string, mas isso evita o erro de arredondamento:

import decimal

def display(x):
    digits = 15
    temp = str(decimal.Decimal(str(x) + '0' * digits))
    return temp[:temp.find('.') + digits + 1]
4
BenH