Python float - str - странность с плавающей точкой
-
21-09-2019 - |
Вопрос
>>> float(str(0.65000000000000002))
0.65000000000000002
>>> float(str(0.47000000000000003))
0.46999999999999997 ???
Что здесь вообще происходит?Как мне преобразовать 0.47000000000000003
в строку, а результирующее значение обратно в float?
Я использую Python 2.5.4 в Windows.
Решение
str(0.47000000000000003)
дать '0.47'
и float('0.47')
может быть 0.46999999999999997
.Это связано со способом представления чисел с плавающей запятой (см. Это википедия статья)
Примечание: float(repr(0.47000000000000003))
или eval(repr(0.47000000000000003))
даст вам ожидаемый результат, но вы должны использовать Десятичная дробь если вам нужна точность.
Другие советы
float (и double) не обладают бесконечной точностью.Естественно, при работе с ними возникают ошибки округления.
Это такой Вопросы и ОТВЕТЫ по Python
Возникает тот же вопрос довольно регулярно в comp.lang.python также.
Я думаю, причина, по которой это часто задаваемые вопросы, заключается в том, что, поскольку python совершенен во всех других отношениях ;-), мы ожидаем, что он будет выполнять арифметику идеально - точно так, как нас учили в школе.Однако, как скажет вам любой, кто прошел курс числовых методов, числа с плавающей запятой очень далеки от совершенства.
Десятичная дробь это хорошая альтернатива, и если вы хотите больше скорости и больше возможностей неуклюжий это тоже здорово.
на этом примере Я думаю, что это ошибка в Python при разделении
>>> print(int(((48/5.0)-9)*5))
2
самый простой способ, я решаю эту проблему следующим образом
>>> print(int(round(((48/5.0)-9)*5,2)))
3