부동소수점(0.1+0.2 != 0.3 ???)
파이썬에서는 실수를 표현하는 방법으로 부동소수점을 쓴다.
>> 간단히 말해 0.1이 진짜 0.1이 아니다.
0.1 + 0.2
# 0.30000000000000004
파이썬의 0.1은 실제로 아래와 같이 0.1이 아닌 0.1에 가까운 값을 나타낸다.
0.1000000000000000055511151231257827021181583404541015625
따라서 0.1+02 = 0.3이 아니게 됨...(실제)
이렇기 때문에 계산할때 특히 금융데이터에서 유의해야함.
부동소수점 연산의 정확성 유지하기
부동소수점 연산에서 주의해야 할 몇 가지 일반적인 문제는 반올림 오차와 비교 연산의 부정확성
이를 방지하기 위해 파이썬에서는 Decimal
모듈을 제공
Decimal
모듈은 고정 소수점 연산을 수행하며, 정확한 결과를 얻을 수 있도록 도와줌
from decimal import Decimal
num1 = Decimal('0.1') num2 = Decimal('0.2') result = num1 + num2 print(result)
# 출력: 0.3
부동소수점 비교 주의사항
부동소수점을 비교할 때는 정확한 결과를 얻기 위해 동등성 비교 대신 오차 범위를 사용해야 함. 이
를 위해 math
모듈의 isclose()
함수나 numpy
의 isclose()
함수를 사용
이 함수들은 두 부동소수점 값이 일정한 오차 범위 내에 있는지를 확인하여 정확한 비교를 수행
import math
num1 = 0.1 + 0.2
num2 = 0.3
if math.isclose(num1, num2):
print("두 값은 동일합니다.")
부동소수점 값을 문자열로 변환하기
부동소수점 값을 문자열로 변환할 때도 주의가 필요
파이썬은 기본적으로 부동소수점 값을 반올림하여 문자열로 변환
따라서 원하는 정확도를 유지하기 위해 문자열 변환 시 소수점 자리수를 명시적으로 지정하는 것이 좋음
num = 3.141592653589793
formatted_num = "{:.2f}".format(num)
print(formatted_num)
# 출력: "3.14"
부동소수점 사용 시 주의사항
부동소수점은 정확성이 한정되어 있으므로 금융 데이터와 같이 정밀한 계산에 사용하기에는 적합하지 않음
이런 경우에는 Decimal
모듈을 사용하거나 정수 연산을 고려하는 것이 좋음
참조
파이썬 코딩 도장: 47.7 실수 값의 오차
파이썬에서 0.1 + 0.2의 값은 얼마일까요? 0.3이 나올 것 같지만 실제로는 0.30000000000000004가 나옵니다. 파이썬은 실수를 부동소수점 방식으로 표현하는데 부동소수점은 실수를 정확히 표현할 수 없
dojang.io