Python float - str - float weirdness

>>> float(str(0.65000000000000002))

0.65000000000000002

>>> float(str(0.47000000000000003))

0.46999999999999997     ???

Что здесь происходит? Как преобразовать 0.47000000000000003 в строку и возвращаемое значение обратно в float?

Я использую Python 2.5.4 для Windows.

Ответ 1

str(0.47000000000000003) дать '0.47' и float('0.47') может быть 0.46999999999999997. Это связано с тем, как представлены числа с плавающей запятой (см. Статью wikipedia)

Примечание: float(repr(0.47000000000000003)) или eval(repr(0.47000000000000003)) даст вам ожидаемый результат, но вы должны использовать Decimal, если вам нужна точность.

Ответ 2

float (и double) не имеют бесконечной точности. Естественно, ошибки округления возникают при работе с ними.

Ответ 3

Это Часто задаваемые вопросы по Python

Тот же вопрос довольно часто появляется в lang.python .

Я думаю, что причина в том, что это ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ, поскольку питон хорош во всех других отношениях;-), мы ожидаем, что он будет выполнять арифметику совершенно так же, как нас учили в школе. Тем не менее, как и любой, кто прошел курс численных методов, вам скажут, что числа с плавающей запятой очень далеки от совершенства.

Decimal - хорошая альтернатива, и если вы хотите увеличить скорость и больше параметров gmpy тоже отлично.

Ответ 4

в этом примере Я думаю, что это ошибка в Python, когда вы делите

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

простой способ, я решаю эту проблему этим

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