데이터과학 삼학년

부동소수점(0.1+0.2 != 0.3 ???) 본문

Python

부동소수점(0.1+0.2 != 0.3 ???)

Dan-k 2023. 7. 17. 18:15
반응형

 

파이썬에서는 실수를 표현하는 방법으로 부동소수점을 쓴다.

>> 간단히 말해 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() 함수나 numpyisclose() 함수를 사용

이 함수들은 두 부동소수점 값이 일정한 오차 범위 내에 있는지를 확인하여 정확한 비교를 수행

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

 

728x90
반응형
LIST
Comments