Вопрос округления Python - PullRequest
       8

Вопрос округления Python

10 голосов
/ 01 февраля 2010

Я столкнулся с очень странной проблемой в python. (Использование python 2.4.x)

В окнах:

>>> a = 2292.5
>>> print '%.0f' % a
2293

Но в Солярисе:

>>> a = 2292.5
>>> print '%.0f' % a
2292

Но это одинаково и для Windows, и для Solaris:

>>> a = 1.5
>>> print '%.0f' % a
2

Может кто-нибудь объяснить это поведение? Я предполагаю, что это зависит от платформы, с которой был собран python?

Ответы [ 3 ]

10 голосов
/ 01 февраля 2010

Функция, которая в конечном итоге отвечает за выполнение этого форматирования, PyOS_snprintf (см. источники ). Как вы догадываетесь, это, к сожалению, зависит от системы, то есть зависит от vsprintf, vsnprintf или других подобных функций, которые в конечном итоге предоставляются библиотекой времени выполнения C платформы (я не помню, говорит ли стандарт C о Форматирование «% f» для чисел с плавающей точкой, которые находятся «точно посередине» между двумя возможными округленными значениями ... но, является ли стандарт C слабым по этому поводу, или, скорее, стандарт C строг, но некоторые среды выполнения C его нарушают, в конечном итоге это довольно академический выпуск ...).

2 голосов
/ 17 марта 2010

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))

0 голосов
/ 01 февраля 2010

I зависит от формы. Вы можете найти документацию здесь .

Хорошо для пользователя ceil или floor , когда вы знаете, что хотите (округлить вверх или вниз).

...