Я столкнулся с очень странной проблемой в Python. (Используя Python 2.4.x)
В окнах:
>>> a = 2292.5
>>> print '%.0f' % a
2293
Но в Солярисе:
>>> a = 2292.5
>>> print '%.0f' % a
2292
Но это - то же в обоих окнах и solaris:
>>> a = 1.5
>>> print '%.0f' % a
2
Кто-то может объяснить это поведение? Я предполагаю, что это - платформа, зависящая от способа, которым был скомпилирован Python?
Функция, в конечном итоге отвечает за выполнение того, что форматирование Pyos_snprintf
(см. Источники ). Когда вы поручив, это, к сожалению, зависимое от системных систем, т. Е. Это опирается на vsprintf
, vsnprintf
или другие аналогичные функции, которые в конечном итоге поставляются библиотекой времени выполнения платформы (я не вспоминаю Если стандарт C ничего не говорит о форматировании «% f» для поплавков, которые являются «именно на полпути» между двумя возможными закругленными значениями ... но, является ли стандарт C LAX об этом, или, скорее, стандарт C строгого, но некоторые C Руководитель разбивает его, в конечном итоге довольно академическая проблема ...).
Я зависит от платформы. Вы можете найти документацию здесь .
Это хорошо для пользователя ceil или floor , когда вы знаете, что хотите (округлить в большую или меньшую сторону).
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))