※ 요약
C언어의 printf를 이용하여 float형이나 double형을 출력할때 소수점 이하 자릿수를 조절해서 출력하는 방법에 대한 글이다. C언어의 printf를 이용하여 자릿수를 정할 때는 보통 printf( "%.2f\n", 3.141592 );와 같이 자릿수를 설정하면 런타임 때 자릿수를 바꿀 수 없지만 이번에 포스팅하는 방법으로는 런타임 때도 자릿수를 바꿀 수 있어 좀 더 유연하게 출력이 가능하다.
C++의 cout도 궁금하다면 부동 소수점의 출력 정밀도 설정을 참고하기 바란다.

※ 소스코드

소스코드는 딱히 설명이 필요없을 정도로 간단하다. 필자는 예제를 위해 아래처럼 Print함수를 제작하였고, 필요에 따라 자릿수를 변경하여 출력하도록 하였다. 참고로 인자로 받을때 레퍼런스로 받도록 &를 붙였는데, 필자가 습관이 되서 붙인거니 C언어에서는 지워야지 에러없이 컴파일이 되니 참고바란다.


※ 결과




※요약

C++의 cout은 C언어의 printf와 달리 출력할 것이 문자인지 정수인지 소수인지 자동으로 알아차리고 출력한다.

위와 같은 것이 가능한 이유는 객체 지향 기능을 가지고 있기 때문에 가능한 것이며, 연산자 오버로딩의 한 예이다.



※특징

 - cout은 "씨 아웃"이라고 발음한다.

 - cout은 문자열, 수, 문자 등 다양한 데이터형을 서식문자 없이 자동으로 출력해 준다.

 - cout에서 << 표시는 왼쪽 시프트 연산자라고 부르지 않고 삽입 연산자 라고 부른다.

 - << 표시는 명령문이 그 문자열을 cout에 전달한다는 것을 뜻하며 <<가 나타내는 방향이 정보의 흐름을 상징한다.

 - 개행을 할 때에는 조정자 endl나 '\n'을 사용한다.



※삽입 연산자 <<에 오버로딩 되어 있는 기본 데이터형들

unsigned char

signed char

char

short

unsigned short

int 

unsigned int

long

unsigned long

float

double

long double

const signed char *

const unsigned char *

const char *

void *



※cout의 진법 변경

printf의 경우 8진법이나 10진법, 16진법을 출력할 때 각각 %o, %d, %x를 사용하는 데 

cout의 경우는 oct, dec, hex 조정자를 사용하여 각 진법을 출력한다.

#include <iostream>

using namespace std;

int main( )
{
	int nNum(14);

	//10진법 출력
	cout << "10진법 : " << nNum << endl;

	//8진법 모드로 설정
	cout << oct;
	cout << "08진법 : " << nNum << endl;

	//16진법 모드로 설정
	cout << hex;
	cout << "16진법 : " << nNum << endl;

	//10진법 다른 방법
	dec(cout);
	cout << "10진법 : " << nNum << endl;

	//8진법 다른 방법
	oct(cout);
	cout << "08진법 : " << nNum << endl;

	//16진법 다른 방법
	hex(cout);
	cout << "16진법 : " << nNum << endl;

	return 0;
}



※부동 소수점의 출력 정밀도 설정

정밀도를 설정할 때는 cout의 멤버 함수인 precision을 이용하여 설정한다.

정밀도는 출력 모드에 따라 그 의미가 조금씩 다르다.

글과 아래 표만 봐서는 이해가 잘 안되는데, 예제를 실행시켜보면 이해가 될 것이다.

 출력 모드

정밀도 의미

디폴트 모드 

총 자릿수

 고정 소수점 표기 모드

소수점 아래 자릿수

 지수 표기 모드

소수점 아래 자릿수

#include <iostream>

using namespace std;

int main( )
{
	float fValue1( 20.04 );
	float fValue2 = 3.141592;
	
	//디폴트 모드
	cout << "fValue1 : " << fValue1 << endl;
	cout << "fValue2 : " << fValue2 << endl;

	//고정 소수점 표기 모드
	cout << fixed;
	cout.precision( 4 );
	cout << "fValue1 : " << fValue1 << endl;
	cout << "fValue2 : " << fValue2 << endl;
	
	//지수 표기 모드
	cout << scientific;
	cout.precision( 6 );
	cout << "fValue1 : " << fValue1 << endl;
	cout << "fValue2 : " << fValue2 << endl;
	
	//디폴트 모드
	cout << defaultfloat;
	cout.precision( 5 );
	cout << "fValue1 : " << fValue1 << endl;
	cout << "fValue2 : " << fValue2 << endl;

	return 0;
}




printf 끝에 붙어 있는 f는 Formatting의 약자로써, 서식화된 출력을 한다는 뜻입니다.

printf함수는 %로 시작하는 서식과 인수(변수)를 대응시켜 조립(Formatting)하는 과정을 거친 뒤 문자열로 출력합니다.


아래는 서식 표 입니다.

출처 책 : 혼자 연구하는 C/C++( page 86 )에 제가 조금 덧붙였습니다.

서식

의미

출력 타입

설명 

%hd

short integer

unsigned short 

 부호없는 10진 정수 출력

%d 또는 %i

Decimal, Integer

int 

10진 정수 출력

%ld


long

10진 정수 출력

%lld


long long

10진 정수 출력

%lu


unsigned long

부호없는 10진 정수 출력

%I64d


__int64

10진 정수 출력 

%I64u


unsigned __int64

부호없는 10진 정수 출력 

%o

Octal

unsigned int

8진 정수 출력

%x 또는 %X

heXadecimal

unsigned int

16진 정수로 출력.

대문자 X 쓰면 A~F도

대문자 출력

%u

Unsigned

unsigned int

부호없는 10진 정수 출력

%c

Character

char, unsigned char

1개의 문자 출력

%s

String

char*, string, CString

문자열 출력

%f

Float

float

고정 소수점 형식의 실수 출력

%lf


double

고정 소수점 형식의 실수 출력

%e 또는 %E


float, double

부동 소수점 형식의 실수 출력

%g 또는 %G


float, double

%e, %f 중 

더 짧은 형식으로 출력

%p

Pointer

void *

포인터의 번지값 출력

%n



출력된 문자 개수를

포인터에 대입

%%



%문자 자체를 출력


혹시 틀린 부분이 있거나 빠진게 있을 경우, 알려주시면 감사하겠습니다.

+ Recent posts