코딩 팁

[C/C++] if절에서의 float 자료형 비교 오류

핑크사우루스 2023. 6. 8. 14:57

문제발견

"BOJ 25206번: 너의 평점은" 문제를 풀다가 이상한 점을 발견했다.

 

25206번: 너의 평점은

인하대학교 컴퓨터공학과를 졸업하기 위해서는, 전공평점이 3.3 이상이거나 졸업고사를 통과해야 한다. 그런데 아뿔싸, 치훈이는 깜빡하고 졸업고사를 응시하지 않았다는 사실을 깨달았다! 치

www.acmicpc.net

실제 문제가 발생한 코드

score_float[i] 값에 0.1의 값이 들어있음에도 불구하고 31번줄의 if절이 실행되지 않았다.

 

나와 같은 문제를 풀다가 여기까지 왔으면 몰라도 그렇지 않다면 문제를 읽고 코드를 이해하기는 너무 귀찮으므로 발생한 문제를 간략한 코드로 나타내면 다음과 같다.

#include <iostream>

using namespace std;

int main(){
	float a = 0.1;
	if(a == 0.1) cout << "a는 0.1 입니다.";
	else cout << "a는 0.1이 아닙니다.";
	
	cout << endl;
	return 0;
}

실행결과...

아주 기가 찰 노릇이다. 왜 이런 오류가 발생했을까?


문제 원인

원인을 찾기 위해 변수 a를 소수점 14자리까지 출력했더니...

#include <iostream>

using namespace std;

int main(){
	float a = 0.1;
	
	cout<<fixed;	// 추가한 부분 시작
    	cout.precision(14);
	cout << a << endl;
	cout << endl;	// 추가한 부분 끝
	
	if(a == 0.1) cout << "a는 0.1 입니다.";
	else cout << "a는 0.1이 아닙니다.";
	
	cout << endl;
	return 0;
}

실행결과

0.1인줄만 알았던 것이 0.1이 아니였다! 소수점 뒤쪽에 쓰레기값이 들어있었다...

이는 이진수로 실수를 표현해야하는 C와 C++의 어쩔 수 없는 한계라 해결할 방법이 아직까지는 없다고 한다.

 

비교 결과값이 같은 다른 조건 형식이 있다면 그걸로 비교를 하도록 하자...

 

(만약 소수점을 지정해서 출력하는 방법을 알고 싶다면 밑의 글을 참고하도록 하자.)

 

[C/C++] 실수형 자료 소수점 지정해서 출력하기

개요 코딩을 하다보면 실수형 자료의 소수점을 지정해서 출력해야할 때가 있을 것이다. 오늘은 C와 C++에서 어떻게 소수점을 지정해서 출력을 하는지 알아보자. C #include int main(){ float a = 0.1234567;

pink-saurus.tistory.com