>>> 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 округляется до ближайшего четного).
Как эту печаль обойти штатными срадствами, не нашел, поэтому пока пользуюсь таким костыликом:
def round27 (number, ndigits=0): result = round(number, ndigits) if abs(result) >= abs(number): return result delta = abs(number) - abs(result) if ndigits >= 0: multiplier = 10.0**(ndigits+1) if abs(number)*multiplier-abs(result)*multiplier == 5.0: result = number + (delta if number >= 0 else -delta) else: multiplier = 10.0**(-ndigits-1) if abs(number)-abs(result) == 5.0*multiplier: result = number + (delta if number >= 0 else -delta) return result
Вообще, оказывается, есть даже стандарт IEEE 754, в котором все эти правила округления указаны. Надо глянуть, может, и ГОСТ найдётся.
UPD. Нашелся вот такой документ: СТ СЭВ 543-77 Числа. Правила записи и округления
Тут как раз округление по правилу "половины дальше от нуля".
Комментариев нет:
Отправить комментарий