Округление Python3 до ближайшего четного
Пары Python3.4 до ближайшего четного (в случае тай-брейка).
>>> round(1.5)
2
>>> round(2.5)
2
Но это только делает это при округлении до целого числа.
>>> round(2.75, 1)
2.8
>>> round(2.85, 1)
2.9
В последнем примере выше я бы ожидал 2.8 в качестве ответа при округлении до ближайшего четного.
Почему существует несоответствие между двумя типами поведения?
Ответы
Ответ 1
Числа с плавающей запятой - это только приближения; 2.85 невозможно представить точно:
>>> format(2.85, '.53f')
'2.85000000000000008881784197001252323389053344726562500'
Это немного больше 2.85.
0,5 и 0,75 могут быть представлены точно с бинарными фракциями (1/2 и 1/2 + 1/4 соответственно).
Функция round()
явно описывает это:
Примечание. Поведение round()
для поплавков может быть неожиданным: например, round(2.675, 2)
дает 2.67
вместо ожидаемого 2.68
. Это не ошибка: это результат того, что большинство десятичных дробей не могут быть представлены точно как float. Подробнее см. Арифметика с плавающей точкой: проблемы и ограничения.
Ответ 2
Марджн понял это правильно. Если вы хотите, чтобы int-grounder округлился до ближайшего четного, тогда я бы пошел с этим:
def myRound(n):
answer = round(n)
if not answer%2:
return answer
if abs(answer+1-n) < abs(answer-1-n):
return answer + 1
else:
return answer - 1
Ответ 3
Чтобы ответить на заголовок... Если вы используете int(n)
, он обрезается до нуля. Если результат не четный, вы добавите его:
n = 2.7 # your whatever float
result = int(n)
if not (result & 1):
result += 1