소수점 자릿수 조절 (반올림/올림/내림)
#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 |