BE THE DEVELOPER

[C/C++] cout.precision과 fixed를 통해 소수점 출력하기 본문

자유공간/임시학습실

[C/C++] cout.precision과 fixed를 통해 소수점 출력하기

미역굳 2023. 12. 13. 23:11

자료구조 과제를 하는 중에 이와 같은 문장을 보게 되었다. 수업을 제대로 듣지 않아서라기엔 수업과 관련 없는 내용인거 같은데.. 처음 보는 메소드라 바로 검색하게 되었다.

timeval을 이용하여 시간 측정하기

과제 내용은 주어진 데이터를 정렬하고, 정렬하는데 걸리는 시간을 알고리즘 별로 비교하는 것이다. 따라서 시간 관련 라이브러리를 다루게 되는데, 이 과제에서는 sys/time.h에 있는 timeval을 이용하였다.

struct timeval start_t, end_t;

gettimeofday(&start_t, NULL);
gettimeofday(&end_t, NULL);

double diff = (double)(end_t.tv_usec - start_t.tv_usec)/100000.0;

gettimeofday() 함수에 인자로 구조체와 NULL값을 지정해주게 되면 구조체에 현재 시간이 담기게 된다. 이를 usec 멤버로 접근하여 차를 구하면 함수의 수행시간을 알 수 있는 것이다.

struct timeval
{
	long tv_sec;  // 초
	long tv_usec; // 마이크로초
}

timeval 구조체는 기본적으로 위처럼 생겼는데, 우리는 수행시간을 double로 초 단위를 표현할 것이기 때문에 마이크로초 값을 빼고, 1,000,000으로 나누어 저장할 것이다. 이렇게 되면 소수점을 출력해야 하는 일이 발생하는데, 우리는 소수점 아래 5자리까지만 취하려고 한다.

cout을 이용하여 소수점 자리 출력하기

기본적으로 출력하려는 실수를 precision값 만큼만 출력한다. 출력하려는 마지막 자리의 아래서 반올림을 하여 출력하게 된다.

double number = 10.0123456;

cout.precision(6);
cout << number << endl; // 10.0123

여기서 fixed를 통해, 이 precision값을 소수점 아래 자리 수를 얼만큼 출력하는지를 결정하는데에 사용할 수 있다. fixed는 고정 소수점을 표기하는데에 사용된다.

double number = 10.0123456;

cout.precision(6);
cout << fixed;
cout << number << endl; // 10.012346

fixed의 경우는, 한 번 설정하면 계속 적용되기 때문에 이를 해제할 방법도 있어야 한다. 해제하기 위해서는 아래와 같이 코드를 짜면 된다.

std::cout.unsetf(std::ios::fixed);

분명 과제를 하는 중이었으나.. 처음 보는 내용이었고 간단한 내용이라 앞으로 C++을 사용할 때도 알아둬서 나쁠게 없다고 생각하여 글을 쓰게 되었다. 절대 공부하기 싫어서 쓰는게 아니다. 앞으로도 이렇게 간단하지만, 잠깐 정리할 내용이 있다 싶으면 여기 정리할 예정이다. 생각해보니까 백준 풀 때도 실수 문제에는 쓸 일 있을 듯..