본문 바로가기
Python/파이썬 문법 Tips

[ 파이썬(python) ] python에서 음의 정수를 floor 해보기

by YWTechIT 2021. 7. 1.
728x90

📍 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처리를 하면 헷갈릴 수 있으므로 다음의 순서를 생각하며 계산하면 쉽다.

 

  1. -7 / 2 = -3.5
  2. floor처리(x보다 작거나 같은 가장 큰 정수)를 한다.
  3. - 7 // 2 = -4가 된다.

 

더 자세한 설명은 스택오버플로우1, 스택오버플로우2를 참고하자.

728x90

번외로, 각 언어를 설계 할 때 정수 나누기를 수행하는 방법은 양의 무한대 혹은 음의 무한대로 반올림하는 경우가 있는데, c는 양의 무한대로 반올림되는 반면, pythonruby에서는 음의 무한대로 반올림된다. 다음은 각 언어별 음의 정수 나누기 결과표이다.

 

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

- 스택오버플로우

반응형

댓글