몽-구
몽구의 우당탕탕 개발 공부
몽-구
전체 방문자
오늘
어제
  • 분류 전체보기 (106)
    • PS (38)
      • 백준 (24)
      • 프로그래머스 (14)
    • Dev (58)
      • Kotlin (0)
      • Java (4)
      • Spring, SpringBoot (1)
      • C (8)
      • Python (10)
      • Dart (1)
      • 알고리즘 (7)
      • 자료구조 (3)
      • Git (1)
      • Linux (2)
      • VS Code (1)
      • 환경 설정 (8)
      • Conference (1)
      • 42Seoul (3)
      • Node.js (1)
      • ShellScript (1)
      • IntelliJ (0)
      • MacOS (2)
      • 기타 (3)
    • CS (1)
      • 데이터베이스 (1)
    • DS (4)
      • Coursera (4)
    • 리뷰 (1)
      • 제품 리뷰 (1)
    • 일상 (3)
      • 자동화 (1)
      • 목표 및 계획 (2)
      • 회고 (0)
    • 삶에 대한 태도 (1)
      • 유튜브를 보며 (1)

블로그 메뉴

  • GitHub

인기 글

반응형

태그

  • 프로그래머스
  • 리눅스
  • 백준온라인저지
  • Python
  • c언어
  • 백준알고리즘
  • 코딩테스트
  • sort
  • Algorithm
  • 파이썬
  • 알고리즘
  • BOJ
  • Linux
  • 백준
  • 정렬

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
몽-구

몽구의 우당탕탕 개발 공부

[C언어] 실수형 변수 출력 시 소수점 자릿수 조절 (반올림/올림/내림)
Dev/C

[C언어] 실수형 변수 출력 시 소수점 자릿수 조절 (반올림/올림/내림)

2020. 6. 17. 12:00
반응형

소수점 자릿수 조절 (반올림/올림/내림)

#include <stdio.h>

int main()
{
	float f1 = 20.0616f;

	printf("소수점 이하 6자리 출력 : %f\n", f1);
	printf("소수점 이하 0자리 출력 : %.f\n", f1);
	printf("소수점 이하 0자리 출력 : %.0f\n", f1);
	printf("소수점 이하 2자리 출력 : %.2f\n", f1);
	printf("소수점 이하 3자리 출력 : %.3f\n", f1);

	return 0;
}

/************** [결과] **************
소수점 이하 6자리 출력 : 20.061600
소수점 이하 0자리 출력 : 20
소수점 이하 0자리 출력 : 20
소수점 이하 2자리 출력 : 20.06
소수점 이하 3자리 출력 : 20.062
************************************/

기본적으로 printf 함수에서 실수형을 출력하기 위한 형식 지정자 %f만을 이용하면 소수점 이하 6자리까지 출력한다.

 

출력 시 소수점 이하의 자릿수를 조절하기 위해서는 형식 지정자 %f의 %와 f 사이에 .n을 입력함으로써 소수점 자릿수를 조절할 수 있다. 여기서 n은 소수점 이하 n자리까지 출력하겠다는 의미다. 참고로 소수 부분을 표현하지 않으려면 %.0f 혹은 %.f로 소수점을 조절할 수 있다. 일반적으로 %.f를 더 많이 쓴다.

 

유의할 점은 소수점 이하 n자리를 출력할 시, 소수점 이하 n+1자리에서 반올림을 하여 소수점 이하 n자리를 출력해준다.  만약 올림이나 내림을 하고 싶다면 아래와 같이 math.h 헤더 파일에 정의된 올림 함수 ceil, 내림 함수 floor을 이용해야 한다.

 

#include <stdio.h>
#include <math.h> 

int main()
{
	float f1 = 12.631f;
	float f2 = 17.5739f;

	// 올림하는 경우, math.h 내부에 정의되어 있는 ceil 함수 이용 
	printf("%.2f\n", ceil(f1*100)/100);

	// 내림하는 경우, math.h 내부에 정의되어 있는 floor 함수 이용
	printf("%.3f", floor(f2*1000)/1000);
    
	return 0;
}

/** [결과] **
12.64
17.573
*************/

ceil 함수는 소수점 첫 번째 자리에서 올림하여 1의 자리에 반영해주는 함수다. floor 함수도 비슷한 원리로 소수점 첫 번째 자리에서 내림하여 1의 자리에 반영해주는 함수다.

 

f1에 100을 곱하면 1263.1이 되고 그 수에 ceil 함수를 적용하면 1264가 된다. 이후 1264를 100으로 나누면 12.64가 된다. 최종적으로 printf 함수에서 %.2f로 형식 지정을 해주면 12.64가 출력된다.

 

f2도 마찬가지다. f2에 1000을 곱하면 17673.9가 되고 그 수에 floor 함수를 적용하면 17673이 된다. 이후 17673을 1000으로 나누면 17.673이 된다. 최종적으로 printf 함수에서 %.3f로 형식 지정을 해주면 17.673이 출력된다.

 

반올림하여 값을 저장하는 방법

해당 글의 트래픽이 급격하게 증가하여 글을 다시 살펴봤는데, 출력할 때 말고 값을 할당할 때 반올림하고 싶은 경우도 궁금할 수 있겠다고 생각된다. 하여, 반올림하여 값을 할당하는 방법을 추가할 예정이다. 올림하거나 내림하여 값을 저장할 때는 위에 언급한 방법을 활용하면 된다.

 

| 실수형 숫자를 정수형 숫자로 할당할 때 반올림하는 방법

#include <stdio.h>

int main()
{
	float f1 = 12.631f;
	int f2 = f1 + 0.5; // int형으로 캐스팅하는 방법을 활용
	printf("%d", f2);

	return 0;
}

/** [결과] **
13
*************/

int형 자료형을 하나 더 선언하여 할당해주는 방법을 통해 손쉽게 반올림할 수 있다. 크게 어려운 것은 없는데, 기존의 값에 0.5를 더해주는 것을 잊지 말자. 실수가 정수형으로 캐스팅되는 순간 소수점 이하 자리가 모두 버림 처리 되기 때문이다.

 

| 실수형 숫자를 실수형 숫자로 할당할 때 반올림하는 방법

#include <stdio.h>
#include <math.h>

int main()
{
	// n+1번째 자리에서 반올림하여 n번째 자리까지 표현하고 싶다면? 
	// 여기서는 소수점 이하 3번째 자리에서 반올림하므로 n = 2
	int n = 2; 

	double num = 271.6752;
	printf("%f\n", num); // 초기 상태 
	
	num = num * pow(10, n+1) + 5;
	printf("%f\n", num); // 반올림하고자 하는 소수점 이하 자리보다 한칸 더 뒤까지 정수 부분으로 만들어준 후 5를 더한 상태 
	
	num = (int)num / 10 / pow(10, n);
	printf("%f\n", num); // int형 캐스팅을 통해 구하고자 하는 소수점 자리 미만의 부분은 0으로 버리고, 구하고자 하는 소수점 자리수까지만 남도록 처리한 상태

	return 0;
}

/**** [결과] ****
271.675200
271680.200000
271.680000
*****************/

이 방법은 부동소수점과 관련한 이슈로 인해 원하는 결과값을 보장할 수 없다는 문제가 있긴 하다. 사실 코딩하면서 반올림한 수를 주기적으로 저장해야 할 일은 한 번도 겪어보지 못해서 이러한 소스코드가 의미가 있나 싶은 생각도 든다. 그래도 혹시 필요한 분들이 계실까봐 이 허접한 소스코드를 올려 놓는다.

 

 

 

반응형
저작자표시 (새창열림)

'Dev > C' 카테고리의 다른 글

[C언어] scanf 정리  (0) 2020.06.25
[C언어] 변수와 자료형, 그리고 상수  (0) 2020.06.20
[C언어] 문자 자료형과 아스키 코드(ASCII)  (1) 2020.06.19
[C언어] 실수 자료형 정리 (64bit Windows 기준)  (0) 2020.06.16
[C언어] 정수 자료형 정리 (64bit Windows 기준)  (0) 2020.06.15
    'Dev/C' 카테고리의 다른 글
    • [C언어] 변수와 자료형, 그리고 상수
    • [C언어] 문자 자료형과 아스키 코드(ASCII)
    • [C언어] 실수 자료형 정리 (64bit Windows 기준)
    • [C언어] 정수 자료형 정리 (64bit Windows 기준)
    몽-구
    몽-구
    소망보단 목표를, 생각보단 실천을

    티스토리툴바