Pergunta

>>> float(str(0.65000000000000002))

0.65000000000000002

>>> float(str(0.47000000000000003))

0.46999999999999997     ???

O que está acontecendo aqui? Como faço para converter 0.47000000000000003 para string e o valor resultante de volta para flutuar?

Estou usando o Python 2.5.4 no Windows.

Foi útil?

Solução

str(0.47000000000000003) dar '0.47' e float('0.47') pode ser 0.46999999999999997. Isso se deve à maneira como o número do ponto flutuante é representado (veja isso Wikipedia artigo)

Observação: float(repr(0.47000000000000003)) ou eval(repr(0.47000000000000003)) dará a você o resultado esperado, mas você deve usar Decimal Se você precisar de precisão.

Outras dicas

O flutuador (e o dobro) não possui precisão infinita. Naturalmente, os erros de arredondamento ocorrem quando você opera neles.

Isto é um Perguntas frequentes em Python

A mesma pergunta surge bastante regularmente em comp.lang.python também.

Eu acho que a razão pela qual é uma FAQ é que, porque o Python é perfeito em todos os outros aspectos ;-), esperamos que ele realize perfeitamente a aritmética - assim como fomos ensinados na escola. No entanto, como qualquer um que tenha feito um curso de métodos numéricos dirá, os números de pontos flutuantes estão muito longe do perfeito.

Decimal é uma boa alternativa e se você quiser mais velocidade e mais opções GMPY é ótimo também.

Neste exemplo, acho que este é um erro no python quando você devide

    >>> print(int(((48/5.0)-9)*5))
    2

da maneira mais fácil, eu resolvo esse problema com isso

    >>> print(int(round(((48/5.0)-9)*5,2)))
    3
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top