Проблема округления на Python
Я столкнулся с очень странной проблемой в python. (Использование python 2.4.x)
В окнах:
>>> a = 2292.5
>>> print '%.0f' % a
2293
Но в Solaris:
>>> a = 2292.5
>>> print '%.0f' % a
2292
Но это то же самое и в окнах, и в Solaris:
>>> a = 1.5
>>> print '%.0f' % a
2
Может кто-нибудь объяснить это поведение? Я предполагаю, что эта платформа зависит от того, как скомпилирован python?
Ответы
Ответ 1
Функция, которая в конечном счете отвечает за выполнение этого форматирования, PyOS_snprintf
(см. источники). Как вы догадались, что, к сожалению, зависит от системы, т.е. Полагается на vsprintf
, vsnprintf
или другие подобные функции, которые в конечном итоге предоставляются библиотекой времени выполнения платформы C (я не помню, что в стандарте C ничего не говорится о Форматирование "% f" для плавающих "ровно на полпути" между двумя возможными округленными значениями... но, является ли стандарт C слабым по этому поводу, или, скорее, стандарт C является строгим, но некоторые C runtimes его нарушают, в конечном итоге это довольно академическая проблема...).
Ответ 2
round() раундов к ближайшему четному целому числу
"% n.nf" работает так же, как round()
int() усекает в нуль
"округление положительного числа до ближайшего целого числа
могут быть реализованы путем добавления 0,5 и усечения "
- http://en.wikipedia.org/wiki/Rounding
В Python вы можете сделать это с помощью math.trunc( n + 0.5 )
предполагая, что n положительно, конечно...
Если "раунд от половины до четного" не подходит, я теперь использую
math.trunc( n + 0.5 )
, где я использовал int(round(n))
Ответ 3
Я зависит от формы. Вы можете найти документацию здесь.
Хорошо пользователю ceil или floor, когда вы знаете, что хотите (округлить вверх или вниз).