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