Форум сайта python.su
Здравствуйте.
Начинаю учить питон.Столкнулся с такой странностью:при попытке округлить какой-то float при помощи round(),получаю странные результаты…
>>> round (2.12223,2)
2.1200000000000001
>>> round (2.22223,2)
2.2200000000000002
>>> round (2.33523,2)
2.3399999999999999
>>> round (2.42223,2)
2.4199999999999999
>>> round (2.52223,2)
2.52
>>> round (2.62223,2)
2.6200000000000001
>>> round (2.72223,2)
2.7200000000000002
>>> round (2.82223,2)
2.8199999999999998
>>> round (2.92223,2)
2.9199999999999999
Тоеть, все сработало правильно только в случае,когда первый знак после точки был 5… в чем может быть проблема?
версия питона 2.5.2
PS: кстати, точно такой же вывод флоатов наблюдается при простом вбивании числа:
>>> 2.3
2.2999999999999998
Заранее благодарен за ответ :)
Офлайн
некоторые флоаты нельзя хранить полностью в памяти в таком виде, как хочется =)
но если тебе надо вывести число, все будет ок:
a = round (2.42223,2)
print ‘%.2f’ % a
Офлайн
Это не проблема питона, а беда floating point вообще.
http://ru.wikipedia.org/wiki/Числа_с_плавающей_запятой - и дальше читать.
Если вкратце:
2.3 это
2 целых 3 десятых
три десятых нацело не переводится в сколько-то там вторых
Поэтому имеем 2.2999999999999998
Хорошая новость: в python 2.6 появится fractions, умеющий работать с натуральными дробями.
Плохая новость: подождите около года - или пользуйте альфа-версию уже сейчас
Офлайн
Можно использовать decimal.
Офлайн