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