Проблема округления на 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, когда вы знаете, что хотите (округлить вверх или вниз).