Python плавать - str - плавать странность

>>> float(str(0.65000000000000002))

0.65000000000000002

>>> float(str(0.47000000000000003))

0.46999999999999997     ???

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

Я использую Python 2.5.4 на Windows.

4 ответа

Решение

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

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

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

Это Python FAQ

Этот же вопрос довольно часто возникает и в comp.lang.python.

Я думаю, что это часто задаваемые вопросы, потому что python идеален во всех других отношениях;-), мы ожидаем, что он будет отлично выполнять арифметику - так же, как нас учили в школе. Однако, как скажет любой, кто прошел курс численных методов, числа с плавающей запятой очень далеки от совершенства.

Десятичная дробь - хорошая альтернатива, и если вы хотите больше скорости и больше опций, gmpy тоже подойдет.

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

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

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

    >>> print(int(round(((48/5.0)-9)*5,2)))
    3
Другие вопросы по тегам