Estou fazendo um programa que, por motivos que não precisam ser explicados, requer que um float seja convertido em uma string a ser contada com len (). No entanto, str (float (x)) resulta em x sendo arredondado quando convertido em uma string, o que joga tudo fora. Alguém sabe de uma solução para isso? Este é o código que está sendo usado se você quiser saber:
len(str(float(x)/3))
python
string
floating-point
rounding
Galileo
fonte
fonte
x
. Sem exemplos, podemos apenas adivinhar qual é o problema.Respostas:
Algumas formas de arredondamento costumam ser inevitáveis ao lidar com números de ponto flutuante. Isso ocorre porque os números que você pode expressar exatamente na base 10 nem sempre podem ser expressos exatamente na base 2 (que o seu computador usa).
Por exemplo:
Neste caso, você está vendo .1 convertido em uma string usando
repr
:Eu acredito que o python corta os últimos dígitos quando você usa str () para contornar este problema, mas é uma solução alternativa parcial que não substitui a compreensão do que está acontecendo.
Não tenho certeza de quais problemas o "arredondamento" está causando. Talvez você se saísse melhor com a formatação de strings como uma forma de controlar mais precisamente sua saída?
por exemplo
Documentação aqui .
fonte
No entanto, devo dizer que isso não é tão confiável quanto você pensa.
Floats são inseridos / exibidos como números decimais, mas seu computador (na verdade, sua biblioteca C padrão) os armazena como binários. Você obtém alguns efeitos colaterais dessa transição:
A explicação de por que isso acontece está neste capítulo do tutorial de python.
Uma solução seria usar um tipo que rastreia especificamente números decimais, como o de python
decimal.Decimal
:fonte
Outras respostas já apontaram que a representação de números flutuantes é uma questão espinhosa, para dizer o mínimo.
Como você não fornece contexto suficiente para sua pergunta, não posso saber se o módulo decimal pode ser útil para suas necessidades:
http://docs.python.org/library/decimal.html
Entre outras coisas, você pode especificar explicitamente a precisão que deseja obter (nos documentos):
Um exemplo simples do meu prompt (python 2.6):
Talvez isso possa ajudar? decimal está em python stdlib desde 2.4, com adições em python 2.6.
Espero que isso ajude, Francesco
fonte
Sei que é tarde demais, mas para quem está vindo pela primeira vez, gostaria de postar uma solução. Eu tenho um valor flutuante
index
e uma stringimgfile
e tive o mesmo problema que você. Foi assim que resolvi o problemaA saída é
Você pode modificar este exemplo de formatação conforme sua conveniência.
fonte