Уведомления

Группа в Telegram: @pythonsu

#1 Март 15, 2008 13:59:08

cyhiso
От:
Зарегистрирован: 2008-03-15
Сообщения: 14
Репутация: +  0  -
Профиль   Отправить e-mail  

проблема с round()

Здравствуйте.
Начинаю учить питон.Столкнулся с такой странностью:при попытке округлить какой-то 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

Заранее благодарен за ответ :)



Офлайн

#2 Март 15, 2008 15:14:07

cybergrind
От:
Зарегистрирован: 2008-01-21
Сообщения: 201
Репутация: +  0  -
Профиль   Отправить e-mail  

проблема с round()

некоторые флоаты нельзя хранить полностью в памяти в таком виде, как хочется =)
но если тебе надо вывести число, все будет ок:

a = round (2.42223,2)
print ‘%.2f’ % a



Офлайн

#3 Март 16, 2008 02:07:38

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

проблема с round()

Это не проблема питона, а беда floating point вообще.
http://ru.wikipedia.org/wiki/Числа_с_плавающей_запятой - и дальше читать.
Если вкратце:
2.3 это
2 целых 3 десятых
три десятых нацело не переводится в сколько-то там вторых
Поэтому имеем 2.2999999999999998
Хорошая новость: в python 2.6 появится fractions, умеющий работать с натуральными дробями.
Плохая новость: подождите около года - или пользуйте альфа-версию уже сейчас



Офлайн

#4 Март 16, 2008 02:46:32

shiza
От:
Зарегистрирован: 2007-07-03
Сообщения: 1073
Репутация: +  0  -
Профиль   Отправить e-mail  

проблема с round()

Можно использовать decimal.



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version