일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- feature map
- depthwise convolution
- 연산량 감소
- Two Pointer
- outer join
- 백준
- 데이터모델링
- dfs
- 식별자
- 1x1 Convolution
- Inductive Bias
- SQLD 후기
- BFS
- pytorch
- 정규화
- 인접리스트
- get_dummies()
- skip connection
- bottleneck
- 엔터티
- SQLD
- 인접행렬
- 그래프
- SQL
- resnet
- dp
- CROSS JOIN
- Depthwise Separable Convolution
- mobilenet
- numpy
- Today
- Total
SJ_Koding
Python의 built-in round 함수에 대해 (.5값 처리 방식) 본문
이번 글 요약: 파이썬의 built-in round()는 .5에 대해 올림을할까요 내림을할까요?
파이썬에서 반올림을 지원하는 내장 함수 round() 가 있다.
- 음수를 반올림하고, 반올림 자리가 음수인 경우 (예: 십의 자리나 백의 자리에서 반올림):
- round(-419.219, -1) = -420.0
- round(-866.057, -1) = -870.0
- round(-231.095, -2) = -200.0
- 음수를 반올림하고, 반올림 자리가 양수인 경우 (예: 소수점 첫째 자리나 둘째 자리에서 반올림):
- round(-44.754, 1) = -44.8
- round(-195.738, 2) = -195.74
- round(-392.451, 2) = -392.45
- 양수를 반올림하고, 반올림 자리가 음수인 경우:
- round(334.167, -1) = 330.0
- round(540.956, -2) = 500.0
- round(380.651, -2) = 400.0
- 양수를 반올림하고, 반올림 자리가 양수인 경우:
- round(226.024, 2) = 226.02
- round(290.004, 1) = 290.0
- round(304.254, 2) = 304.25
(GPT 고마워!) round(반올림할 숫자, 반올림 범위)를 지정하여 위와 같이 사용할 수 있다.
그런데 내가 이 글을 포스팅하는 이유, round함수에 대해 신경쓰지 못했던 부분이 있다.
바로 x.5 일 경우 Python 의 built-in round()함수는 버림을하는가 올림을하는가?
핵심 질문 Q. 파이썬의 round함수는 .5에 대해 올림을할까요 내림을할까요?
정답은 "경우에 따라 둘 다 진행한다"
이 경우를 확인하게 된건 백준문제의 18110번 : solved.ac 문제를 풀 때 알게 되었다. (문제이동: http://boj.kr/18110)
논리상 전혀 문제가 없는데 계속 틀렸습니다가 나오길래,,, 아마 왜 틀렸는지 모르겠다 하시는 분들은 모두 아래의 반례 사례일 것 같다.
입력:
2
2
3
예상 출력:
3
실제 출력:
2
아! Python에서는 2.5에 대해 round() 사용하면 버림을 하는구나!
그래서 1.5, 2.5를 round에 통과시켜봤더니
print(round(1.5))
print(round(2.5))
# 결과:
# 2
# 2
2로 동일한 값이 나온 것을 확인했다. 엥?
결론
Python의 round는 Bankers' Rounding 형식을 따르며 이는 .5에 대해 가장 가까운 짝수로 반올림 하는 형식을 의미한다.
통계적으로 반올림에 의한 오류를 줄이는 데 도움이 되며, 장기적으로는 데이터의 편향을 최소화하는 효과가 있다고 알려져있다.
만약 올림을 하고 싶다면 0.5를 더하고 math.floor로 버림을 하자! 아래 코드처럼 왜 올림이 되는지는 직접 해보면 쉽게 알 수 있다.
def round_up_half(number):
import math
# 0.5 더한 후 내림을 하여 올림 효과를 낸다
return math.floor(number + 0.5)
( 반대로 버림을 하고싶으면 0.5를 빼고 math.ceil을 하면 된다는 것은 금방 알 수 있다.)
'Algorithm' 카테고리의 다른 글
백준 12865: 배낭문제 (knapsack)(골드 V) - DP (0) | 2024.11.15 |
---|---|
백준 5430: AC (골드 V) - 연산 최소화 방법론 (1) | 2024.01.30 |
Python3 코딩테스트 기초 TIP 모음 (2) | 2023.04.26 |