라떼는말이야

[Python] 0.3 + 0.6은 0.9가 아니다?! 본문

공부

[Python] 0.3 + 0.6은 0.9가 아니다?!

MangBaam 2021. 8. 22. 00:40
반응형
0.3 + 0.6은 0.9가 아니다!!

파이썬으로 0.3 + 0.6을 계산해보면 0.9가 나오지 않는다.

0.89999999999999 라는 근사치가 나온다.

if문으로 확인을 해보아도 역시나 다르다고 나온다.

 

왜 그럴까?

그 이유는 컴퓨터가 2진수를 사용하기 때문이다.

컴퓨터가 실수를 처리할 때 부동 소수점(Floating-point)을 사용하는데, IEEE754 표준에서 실수형을 저장할 때 4Byte 혹은 8Byte를 사용한다. 그래서 실수 값을 표현할 때 정확도에 한계를 가지게 된다.

2진수에서 0.9를 정확히 표현할 수 있는 방법이 없다.

최대한 0.9와 가깝게 표현하지만 실제로는 미세한 오차가 발생하게 되는 것이다.

0.9에서 다른 수를 빼도 마찬가지로 미세한 오차가 발생한다.

(단, 0.9 - 0.9 혹은 0.9 - 0 은 각각 0과 0.9로 표현이 된다)

 

그럼 어떻게 쓰죠?

은행과 같이 매우 정교한 계산이 필요한 곳에서는 아쉽게도 내장된 계산이 아닌 별도의 계산 로직을 사용해야 한다.

그러나 코딩테스트나 일반적인 경우에는 반올림을 사용하면 된다.

발생하는 오차는 아주 작은 값이기 때문에 적당한 수준에서 반올림을 한다.

코딩테스트의 경우 실수형 데이터를 비교할 때 주로 소수점 다섯 번째 자리에서 반올림한 결과가 같다면 정답으로 인정하는 식으로 처리하기 때문에 다음과 실수를 처리하면 된다.

round() 함수를 사용한 반올림

round(숫자, 표현할 소수점 자리)

round() 함수는 첫 번째 인자로 반올림 할 숫자를 입력 받는다.

두 번째 인자는 표현할 소수점 자리를 입력 받는데 예를 들어 4라고 하면 소수점 5번째 자리에서 반올림 하여 4번째 자리까지 표현하는 것이다.

round() 함수에 음수 입력

만약 -2와 같이 음수가 들어왔다면 (-2의 경우) 10의 자리에서 반올림을 해 100의 자리부터 표현할 수 있다.

반응형
Comments