일단 시작하는 IT개발 블로그
  • 내림, 올림, 반올림 함수 ceil, floor, round함수.
    2022년 03월 13일 12시 36분 31초에 업로드 된 글입니다.
    작성자: sooooong_minseok
    #include <stdio.h>
    #include <math.h>
    
    int main(void)
    {
    	float a = 3.0f;
    	float b = 3.5f;
    	float c = 4.5f;
    
    	//ceil 올림, floor 내림 +0.5반올림 -0.5반내림.
    
    	printf("%.2f\n", ceil(a));
    	printf("%.2f\n", floor(a));
    
    	printf("%.2f\n", ceil(b));
    	printf("%.2f\n", floor(b));
    
    	printf("%.2f\n", ceil(c));
    	printf("%.2f\n", floor(c));
    
    	printf("%f\n", round(a));
    	printf("%f\n", round(b));
    	printf("%f\n", round(c));
    
    
    	return 0;
    }

    1. #include <math.h>과 ceil, floor, round함수

    ceil함수는 올림, floor함수는 내임을 표현한다.

    round함수는 반올림을 표현한다.

    이 세 함수를 사용하기 위해서는 #include <math.h>을 포함을 시켜야만 한다.

     

    ceil함수는 3.(0초과의 숫자이면) 무조건 올려버린다.floor함수는 3.(어떤 수이더라도) 무조건 내려버린다.(또는 버림)

    round는 반올림으로 +0.5를 하고 버리는 것과 같다.


    2. %f와 round함수의 반올림 차이.

    //5의 경우에는 5의 앞자리가 홀수인 경우엔 올림을 하고 짝수인 경우엔 버림을 하여 짝수로 만들어준다.
    
    float i = 3.5, j = 4.5;
    printf("%.0f, %.0f\n", i, j); //출력값 4 4
    printf("%.0f, %.0f\n", round(i), round(j)); //출력값 4 5

    >>3.5의 반올림 값과 4.5의 반올림 값을 서로 같다.

    홀수의 경우 올림.

    짝수의 경우 버림. 연산을 하기 때문이다.

     

    특이한 점!!!!

    >> %.0f를 활용하여 반올림 과정을 거치면 홀짝를 구분하여 올림내림 처리하지만,

    >> round함수의 경우 5이상이면 모두 올림, 5미만이면 내림 처리를 한다.


    3. 반올림을 할 때 헷갈린 부분.

        float a = 3.0f;
        float half = 0.5f;
    
        printf("%.0f\n", a + half); // 1번 안
        printf("%.0f\n", floor(a + half)); // 2번 안
        printf("%d\n", (int)(a + half)); // 3번 안

    반올림의 과정은 +0.5-> 소수점 자리를 제거 - > 정수 자리만 표현의 과정을 거친다.

    첫 번째 출력의 의도는 반올림한 결과를 %.0f집어 넣으면 반올림의 결과를 그대로 받는 줄 알았다.

    (나의 생각 - a+half = 3.5 > 3.5의 0.5를 제거된 3이 들어간다)

     

    >> 그러나 이것은 잘못된 결과를 나온다.

    %.0f연산에는 반올림 연산이 함께 작용하기 때문이다.

    a+half로 반올림한 연산이 한 번 더 반올림 되는 셈이다.

    그 결과 엉뚱한 결과 값이 나오게 된다.

    (출력 내용 - a+half = 3.5 > 3.5 반올림 연산 > 4 출력)

     

    따라서 1번안은 아래와 같이 수정이 가능하다.

    float a = 3.0f;
    
    printf("%.0f\n", a);

    이 경우 반올림을 한 번을 통해 3이 출력 된다.

     

    정리.

    1번 안의 경우 홀, 짝 구분으로 반올림을 한다.

    2,3번 안은 round함수와 같이 5이상 올림 5미만 버림의 연산을 거친다.

    반올림의 과정을 0.5를 더하고 버리는 형태를 갖추고 대입하는 방식이 있다.

    round 함수 역시 이런 과정을 거쳐서 반올림을 하는 것 같다.

     


    >>1번안과 같은 생각하게 된 것은. %f의 반올림 연산을 생각하지 않았기 때문인 것 같다.

    >>홀수일 때 올림, 짝수일 때 내림 연산을 한다. //round함수를 쓸 경우 5이상 올림 5미만 내림

    >>'round 연산의 과정은 0.5를 더하고 버리는 형태이다. >> 2,3번안의 형태가 들어있지 않을까? 생각한다.

    >>결론적으로 %f '자체'의 반올림 연산과 round함수의 반올림 차이가 있음을 기억해두자.

     

     

     

    댓글