📍 python에서 음의 정수를 floor 해보기
프로그래머스 - 기능개발 문제에서 전처리 과정 중 100 - progress[x] // speeds[x]
을 해야 하는 과정이 있었는데 나는 나머지가 있는 / 없는
조건을 사용하여 해결했으나 math.floor
혹은 //
를 사용하여 해결한 다른 사람의 코드를 봤다.
바로 음수 floor
를 사용한 것인데, 지금까지 양수 floor
만 사용해봤어서 음수는 어떤 원리로 계산되는지 궁금했다. 먼저 floor
의 정의(공식문서)는 다음과 같다. the largest integer less than or equal to x
직역하면 x보다 작거나 같은 가장 큰 정수
를 뜻하는데, 말로만 설명해서는 이해가 잘 되지 않을 수 있으니까 예시를 살펴보자. (하단 코드 참고)
from math import floor
# 양수 floor
print(floor(2))
print(floor(2.00001))
print(floor(2.99999))
👉🏽 2
# 음수 floor
print(floor(-2.0001))
print(floor(-2.9999))
print(floor(-3))
👉🏽 -3
코드를 보니 양수일 때는 현재 값보다 작거나 같은 가장 큰 정수
는 2인 것을 알 수 있다. 같은 값인데도 불구하고 음수의 경우에는 왜 -2
대신 -3
이 나올까?? 예를 들어 -7 // 2
연산을 해보자. 한 번에 floor
처리를 하면 헷갈릴 수 있으므로 다음의 순서를 생각하며 계산하면 쉽다.
-7 / 2 = -3.5
floor
처리(x보다 작거나 같은 가장 큰 정수
)를 한다.- 7 // 2 = -4
가 된다.
더 자세한 설명은 스택오버플로우1, 스택오버플로우2를 참고하자.
번외로, 각 언어를 설계 할 때 정수 나누기를 수행하는 방법은 양의 무한대
혹은 음의 무한대
로 반올림하는 경우가 있는데, c
는 양의 무한대로 반올림되는 반면, python
과 ruby
에서는 음의 무한대로 반올림된다. 다음은 각 언어별 음의 정수 나누기 결과표이다.
Language | Code | Result |
---|---|---|
ruby | -1 / 5 | -1 |
python | -1 / 5 | -1 |
c | -1 / 5 | 0 |
clojure | (int (/ -1 5)) | 0 |
emacslisp | (/ -1 5) | 0 |
bash | expr -1 / 5 | 0 |
결론: python
에서 음의 정수의 나눗셈
은 음의 무한대
로 반올림한다.
Reference
- 스택오버플로우
'Python > 파이썬 문법 Tips' 카테고리의 다른 글
[ 파이썬(python) ] 2차원 행렬 시계방향으로 한 칸씩 회전하기 (0) | 2021.07.15 |
---|---|
[ 파이썬(python) ] 절사평균과 round(반올림) 함수 그리고 부동소수점 비교 (0) | 2021.07.13 |
[ 파이썬(python) ] 리스트 중 front, back에서부터 target index까지 어느쪽이 더 가까운지 판단하기 (0) | 2021.06.25 |
[ 파이썬(python) ] 삼각수(계차수열) 나타내기 (0) | 2021.06.20 |
[ 파이썬(python) ] 2차원 행렬 시계, 반시계 방향으로 90도 뒤집기 (0) | 2021.06.15 |
댓글