파이썬에서 숫자형 데이터를 다루고 계신가요? 파이썬에서 숫자를 반올림하는 다양한 방법을 익혀 실력을 향상시켜 보세요.
대부분의 실제 데이터 세트에는 숫자형 특성과 범주형 특성이 혼합되어 있습니다. 센서 데이터부터 환율, 생체 신호에 이르기까지 다양한 형태의 숫자형 데이터가 존재합니다.
숫자 값을 다룰 때, 다음과 같은 이유로 특정 정밀도로 반올림해야 할 필요가 생길 수 있습니다:
- 데이터 형식을 일관되게 유지
- 저장 및 처리를 보다 간편하게 만들기
이 튜토리얼에서는 숫자를 특정 정밀도로 반올림하는 방법, 가장 가까운 정수로 올림 및 내림하는 방법 등 다양한 반올림 기술을 살펴볼 것입니다.
자, 시작해볼까요!
내장 함수 round()를 사용한 숫자 반올림 방법
파이썬에서 숫자를 반올림하는 가장 일반적인 방법은 내장된 round() 함수를 이용하는 것입니다. 먼저 이 함수의 문법부터 알아보겠습니다.
round(num, ndigits)
여기서,
- num은 반올림하려는 숫자입니다.
- ndigits는 선택적 매개변수이며 기본값은 None입니다. 이 값은 숫자를 반올림할 자릿수를 지정합니다. 예를 들어, ndigits = 2 이면 num은 소수점 이하 두 자리로 반올림됩니다.
- round() 함수는 소수점 이하 ndigits 정밀도로 반올림된 num 값을 반환합니다.
Python round() 함수 사용 예시
round() 함수의 작동 방식을 더 잘 이해하기 위해 몇 가지 예제 코드를 살펴보겠습니다.
앞서 언급했듯이 ndigits는 선택 사항입니다. 따라서 숫자만 가지고 round() 함수를 호출하면 숫자는 가장 가까운 정수로 반올림됩니다.
number = 7.123456 rounded = round(number) print(rounded) # 출력: 7
이제 정밀도를 지정하는 몇 가지 예시를 살펴보겠습니다.
ndigits를 2로 설정하면 숫자는 소수점 이하 두 자리(소수 둘째 자리)로 반올림됩니다.
number = 7.123456 rounded = round(number, 2) print(rounded) # 출력: 7.12
ndigits를 3으로 설정하면 숫자는 소수점 이하 세 자리(소수 셋째 자리)로 반올림됩니다.
number = 7.123456 rounded = round(number, 3) print(rounded) # 출력: 7.123
round() 함수를 사용하여 음수도 반올림할 수 있습니다.
number = -3.4 rounded = round(number) print(rounded) # 출력: -3
이 경우 함수는 -3.4를 가장 가까운 정수인 -3으로 반올림합니다.
십의 자리 및 백의 자리로 반올림
ndigits가 음수 값을 가질 수도 있다는 것을 알고 계셨나요?
네, ndigits에 음수 값을 사용하여 round() 함수를 호출할 수 있습니다. 이렇게 하면 소수점 오른쪽이 아닌 왼쪽에서 반올림이 수행됩니다.
이것은 무슨 의미일까요? 몇 가지 예시를 통해 알아보겠습니다.
ndigits를 -1로 설정하면 숫자는 가장 가까운 10의 자리로 반올림됩니다.
number = 7.123456 rounded = round(number, -1) print(rounded) # 출력: 10.0
그리고 ndigits를 -2로 설정하여 round() 함수를 호출하면 숫자 77.123456이 가장 가까운 100 단위로 반올림됩니다. 이 경우에는 100.0이 됩니다.
number = 77.123456 rounded = round(number, -2) print(rounded) # 출력: 100.0
지금까지 round() 함수는 학교 수학에서 배운 반올림의 일반적인 원칙을 따르는 것처럼 보입니다. 하지만 항상 그런 것은 아닙니다.
부동 소수점 숫자에는 몇 가지 제한 사항이 있습니다. 따라서 반올림을 할 때 예상치 못한 결과가 나올 수도 있습니다. 또 다른 흥미로운 점은 ‘은행원 반올림’입니다.
은행원 반올림이란?
파이썬 REPL을 시작하고 다음 예시를 시도해 보세요.
>>> round(1.5) 2
round(1.5)가 (예상대로) 2를 반환하는 것을 볼 수 있습니다. 그렇다면 round(2.5)는 무엇을 반환해야 할까요?
>>> round(2.5) 2
흥미롭지 않나요? round(1.5)와 round(2.5) 모두 2를 반환합니다. 그런데 어떻게, 왜 그럴까요?
내부적으로 round 함수는 다음과 같이 작동합니다. 두 정수의 정확히 중간에 있는 모든 값은 가장 가까운 짝수로 반올림됩니다. 이를 은행원 반올림 또는 반올림 시 짝수 전략이라고 합니다.
우리는 round() 함수가 기본적인 반올림 작업에 충분하다는 것을 알았습니다. 하지만 때로는 숫자를 가장 가까운 정수로 올림 또는 내림해야 할 수도 있습니다.
그렇다면 어떻게 해야 할까요? 다음 섹션에서 자세히 알아보겠습니다.
파이썬에서 숫자 올림하는 방법
숫자를 가장 가까운 정수로 올림하려면 다음을 사용할 수 있습니다:
math.ceil 사용
ceil() 함수(또는 천장 함수)는 숫자를 해당 숫자보다 큰 가장 작은 정수로 올림합니다.
다음 코드 스니펫은 ceil() 함수를 사용하여 숫자 3.2를 올림하는 방법을 보여줍니다.
import math number = 3.2 rounded_up = math.ceil(number) print(rounded_up) # 출력: 4
Decimal 모듈 사용
지금까지 파이썬의 내장된 float 데이터 형식을 사용했습니다. 하지만 과학 컴퓨팅 및 금융 분야의 특정 응용 분야에서는 훨씬 더 높은 정밀도가 요구됩니다. 이를 위해 파이썬은 다음과 같은 기능을 제공하는 Decimal 모듈을 제공합니다:
- 보다 정확한 부동 소수점 연산
- 신뢰할 수 있는 동등성 테스트
- 정밀도 수준을 세밀하게 제어(기본 정밀도는 28자리)
현재 컨텍스트를 확인하려면 getcontext()를 사용합니다.
from decimal import getcontext current_context = getcontext() print(current_context)
현재 정밀도와 반올림 모드를 확인할 수 있습니다.
# 출력 Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, capitals=1, clamp=0, flags=[], traps=[InvalidOperation, DivisionByZero, Overflow])
숫자를 올림하려면 정밀도(가장 가까운 정수로 올림하므로 0.0)와 반올림 모드: ROUND_CEILING을 지정하여 quantize()를 사용할 수 있습니다.
from decimal import Decimal, ROUND_CEILING number = Decimal('3.2') rounded_up = number.quantize(Decimal('0'), rounding=ROUND_CEILING) print(rounded_up) # 출력: 4
여기서 숫자 3.2는 가장 가까운 정수 4로 올림되었습니다.
파이썬에서 숫자 내림하는 방법
이제 파이썬에서 숫자를 내림하는 방법을 살펴보겠습니다. 올림 프로세스와 마찬가지로 math 또는 decimal 모듈을 사용할 수 있습니다.
math.floor 사용
math 모듈의 floor() 함수는 숫자를 해당 숫자보다 작은 가장 큰 정수로 내림합니다.
다음 예시를 살펴보겠습니다.
import math number = 3.8 rounded_down = math.floor(number) print(rounded_down) # 출력: 3
여기서 floor() 함수는 부동 소수점 숫자 3.8을 3으로 내림합니다.
Decimal 모듈 사용
숫자를 내림하려면 반올림 모드를 ROUND_FLOOR로 설정하여 quantize()를 사용할 수 있습니다.
from decimal import Decimal, ROUND_FLOOR number = Decimal('3.8') rounded_down = number.quantize(Decimal('0'), rounding=ROUND_FLOOR) print(rounded_down) # 출력: 3
보시다시피 3.8은 3으로 내림되었습니다.
숫자 반올림 시 피해야 할 일반적인 함정
우리는 round() 함수가 숫자를 반올림하여 짝수로 만든다는 것을 이미 확인했지만, 항상 바람직한 것은 아닙니다. 파이썬에서 숫자를 반올림할 때 피해야 할 몇 가지 일반적인 함정이 있습니다.
- 잘못된 동등성 비교: 숫자를 반올림하면 반올림 오류가 발생하는 경우가 많습니다. 반올림된 결과와 다른 값 사이의 동등성 비교를 수행하려고 하면 다양한 정밀도로 인해 동등성 검사가 (거의 항상) 실패합니다. 따라서 부동 소수점 숫자와 반올림된 부동 소수점 숫자 사이의 동등성 검사를 피해야 합니다. 비교가 필요한 경우 허용 오차 임계값을 도입해야 합니다.
- 정보 손실: 특정 데이터는 고정밀도로 캡처된 다양한 타임스탬프의 센서 데이터와 같이 높은 정밀도로 필요할 수 있습니다. 이러한 데이터를 소수점 이하 자리수로 반올림하면 정보가 손실되고 잘못된 분석으로 이어질 수 있습니다.
- 중간 결과 반올림: 계산의 일부로 여러 단계를 수행하는 경우가 많습니다. 모든 단계에서 일관된 정밀도를 유지해야 합니다. 또한 반올림 오류가 누적되는 것을 방지하려면 중간 단계에서의 반올림을 피해야 합니다.
파이썬에서 숫자를 반올림하는 모범 사례
파이썬에서 숫자를 반올림할 때 따라야 할 몇 가지 모범 사례를 살펴보겠습니다.
- 적절한 데이터 유형 선택: 애플리케이션에 따라 부동 소수점 데이터 유형과 decimal 데이터 유형 중에서 선택해야 합니다. 고정밀 부동 소수점 연산을 수행해야 하는 경우에는 decimal 데이터 유형을 선택하는 것이 좋습니다.
- 일관된 정밀도 수준 사용: 예상치 못한 반올림 오류를 방지하려면 전체 프로그램에서 소수에 대해 일관된 정밀도 수준을 설정하는 것이 중요합니다.
- 반올림 기법 문서화: 통화 및 센서 데이터와 같은 데이터와 관련된 실제 애플리케이션에서는 일관되고 문서화된 반올림 기법을 마련하는 것이 중요합니다.
마무리
지금까지 배운 내용을 간단히 요약하면서 이 튜토리얼을 마무리하겠습니다.
- 구문 round(num, ndigits)와 함께 내장된 round() 함수를 사용할 수 있습니다. round() 함수를 사용할 때는 은행원 반올림 전략을 숙지해야 합니다. 따라서 두 정수 사이의 숫자를 가장 가까운 짝수로 정확하게 반올림합니다.
- math 모듈의 ceil() 및 floor() 함수를 사용하여 주어진 숫자를 가장 가까운 정수로 각각 올림하거나 내림할 수 있습니다.
- 고정밀 부동 소수점 연산을 수행해야 하는 경우에는 decimal 모듈을 사용하는 것이 좋습니다. 필요한 정밀도와 반올림 전략을 사용하여 숫자를 반올림할 수 있습니다.
- 파이썬에서 숫자를 반올림할 때 주의해야 할 몇 가지 함정이 있습니다. 여기에는 반올림으로 인한 정보 손실, 중간 단계에서 결과 반올림, 코드의 여러 부분에서 서로 다른 정밀도 사용 등이 포함됩니다.
- 모범 사례에는 애플리케이션에 따라 적절한 데이터 유형을 선택하고 일관된 정밀도 수준을 문서화하는 것이 포함됩니다.
다음에는 파이썬에서 바닥 나눗셈을 수행하는 방법을 알아보겠습니다.
이 글이 도움이 되었나요?
의견을 보내주셔서 감사합니다!