
Python에서 숫자형(Numeric Type)은 가장 기본적인 데이터 타입 중 하나이며, 다양한 계산과 데이터 처리를 위해 필수적입니다.
이번 글에서는 숫자형 타입, 소수점 표현 방식, 부동소수점 연산의 한계(부동소수점 오류)를 다루겠습니다.
Python의 숫자형 타입
Python에서 제공하는 주요 숫자형 데이터 타입은 다음과 같습니다.
int | 정수형 | 10, -5, 1000 |
float | 실수형 | 3.14, -2.5, 1.0 |
complex | 복소수형 | 2+3j, -1j |
정수형 (int)
Python의 int 타입은 무한대의 크기를 가질 수 있습니다.
(타 언어에서는 int 크기가 제한적이지만, Python은 자동으로 메모리를 확장함)
num = 123456789012345678901234567890
print(num) # 정상 출력
실수형 (float)
실수형(float)은 소수점 값을 표현하는데 사용됩니다.
pi = 3.14159
print(pi)
복소수형 (complex)
Python은 복소수 계산도 지원하며, j를 사용해 허수 표현이 가능합니다.
z = 2 + 3j
print(z.real) # 실수부
print(z.imag) # 허수부
소수점 표현 방식 (Floating Point Representation)
컴퓨터는 실수를 2진수(부동소수점) 형식으로 저장하기 때문에, 일부 숫자는 정확히 표현되지 않을 수 있습니다.
10진수와 2진수 변환
십진수(0.1)를 2진수로 변환하면 0.00011001100110011...(무한반복)과 같이 표현됩니다.
따라서, 일부 소수는 2진수로 정확히 저장할 수 없습니다.
print(0.1 + 0.2) # 예상: 0.3, 실제: 0.30000000000000004
이처럼, Python에서 소수 연산을 수행하면 예상과 다른 결과가 나올 수 있습니다.
decimal 모듈을 활용한 해결 방법
Python의 decimal 모듈을 사용하면 보다 정확한 실수 연산을 할 수 있습니다.
from decimal import Decimal
a = Decimal('0.1')
b = Decimal('0.2')
print(a + b) # 정확하게 0.3 출력
- Decimal을 사용하면 부동소수점 오차를 피할 수 있습니다.
부동소수점 오류 (Floating Point Error)
부동소수점(Floating Point) 연산은 컴퓨터의 저장 방식 때문에 정확하지 않은 결과를 만들 수 있습니다.
부동소수점 연산의 한계
print(0.1 + 0.2 == 0.3) # False
위의 결과는 직관적으로 보면 True여야 하지만, 실제로는 False가 출력됩니다.
이는 0.1과 0.2가 2진수로 정확하게 표현되지 않기 때문입니다.
math.isclose()를 활용한 비교
부동소수점 비교 시 절대 ==을 사용하지 않고, math.isclose()를 활용하는 것이 좋습니다.
import math
print(math.isclose(0.1 + 0.2, 0.3)) # True
- math.isclose(a, b, rel_tol=1e-9) → a와 b가 상대 오차 10⁻⁹ 이내이면 True
소수점 반올림 (Rounding)
Python에서 소수를 반올림하는 방법은 여러 가지가 있습니다.
round() 함수 사용
print(round(3.14159, 2)) # 결과: 3.14
- round(값, 소수점 자리수) 형태로 사용합니다.
decimal 모듈을 활용한 정밀 반올림
decimal을 사용하면 더욱 정밀한 반올림이 가능합니다.
from decimal import Decimal, ROUND_HALF_UP
num = Decimal('3.145')
rounded = num.quantize(Decimal('0.01'), rounding=ROUND_HALF_UP)
print(rounded) # 결과: 3.15
마무리
이번 글에서는 Python에서 숫자형을 다루는 방법과, 부동소수점 오류를 피하기 위한 다양한 기법을 배웠습니다.
다음 글에서는 조금 어려운 내용으로 메모리 관리와 할당 연산자, 그리고 가비지 컬렉터와 Rust의 메모리 관리 방식과의 비교를 다루겠습니다.
이 글에서 다룬 내용 외에도 궁금한 점이 있거나, 잘못된 부분이 있다면 댓글로 자유롭게 알려주세요. 여러분의 피드백은 글을 더 발전시키는 데 큰 도움이 됩니다!
'TIL > Python' 카테고리의 다른 글
Python 타입의 동작과 특징 (0) | 2025.02.03 |
---|---|
Python 데이터와 표현식 (0) | 2025.01.24 |
Python 기초 개념 (0) | 2025.01.23 |