Округление в Питон
round(0.5)=0 round(1.5)=2
Не подскажите ли, как округлять всегда, как учили в школе? Если стоит пятерка, то всегда округление в большую сторону?
Также необходимый метод должен принимать значение, сколько знаков после запятой оставлять (round принимает вторым значением как раз точность, но, опять же, не подходит, т. к. round(0.5)=0, а хотелось бы = 1)
Во втором предложении не вопрос, а утверждение )
Выяснилась интересная особенность. В python 2.7 число x.5 округляется до x+1:
>>> print round(0.5), round(1.5)
1.0 2.0
В python 3.3 поведение этой функции изменилось:
>>> print ( round(0.5), round(1.5) )
0 2
то есть, bankers rounding, x.5 к ближайшей четной цифре y.0, да ещё и меняется тип на целый.
вот тут набросал некий корявый костыль, эмулирующий версию 2.7:
[ссылка заблокирована по решению администрации проекта]
math.floor(x) Округляет число вниз, при этом floor(1.5) == 1, floor(-1.5) == -2
math.ceil(x) Округляет число вверх, при этом ceil(1.5) == 2, ceil(-1.5) == -1
"Да, round округляет к ближайшему четному, а не целому, это т. н. банковское округление." - и куда будет округлено round(2.85,1) ..? "к ближайшему четному"? - тогда д.б. 2.8, но получаем 2.9 - ибо 2.85 - есть float и в машинном представлении - чуть-чуть больше чем десятичное 2.85.
поэтому куда округлит round число с 5-кой в любом знаке дробной части - это как повезет...
и непонятно - банковсконе округление применяется только для чисел с 5-кой в первом дробном разряде или вообще? 1234.435 - по банковкому к ближайшему четному 1234.44 - ? а вот вам фигушки! будет 1234.43...
правило округление "0.5" - это правило не для первого знака после зпт (и не банковское округление к ближайшему четному), а 5-ка на любом месте дробной части, поэтому например, куда будет округлено с применением round, по правилу 0.5 в большую, совсем не работает: например,
>>> round(123421.445,2)
123421.45 - в большую, вроде как ожидалось
>>> round(123421.465,2)
123421.46 в меньшую (к ближайшему четному .46?, а почему не в большую?
>>> round(123421.435,2)
123421.43 в меньшую (а почему не к ближайшему четному .44?)
>>>
Поэтому так и непонятно, как округлить по арифметическому правилу "0.5 в большую сторону" без извращений с кучей кода...
Да, round округляет к ближайшему четному, а не целому, это т. н. банковское округление.
"Школьное" округление (0.5 вверх) - это int(x+0.5). Для положительных. Но -0.5 тогда становится 0 (ведь 0>-1). Если есть желание - можешь порасписывать для отрицательных.