[c] C에서 소수점 뒤에 두 자리로만 float 값을 제한하려면 어떻게합니까?

C에서 부동 소수점 값 (예 : 37.777779)을 소수점 이하 두 자리 (37.78)로 반올림하려면 어떻게해야합니까?



답변

출력 목적으로 숫자를 반올림하려면 "%.2f"형식 문자열이 정답입니다. 그러나 실제로 추가 계산을 위해 부동 소수점 값을 반올림하려면 다음과 같이 작동합니다.

#include <math.h>

float val = 37.777779;

float rounded_down = floorf(val * 100) / 100;   /* Result: 37.77 */
float nearest = roundf(val * 100) / 100;  /* Result: 37.78 */
float rounded_up = ceilf(val * 100) / 100;      /* Result: 37.78 */

선택할 수있는 세 가지 반올림 규칙이 있습니다. 반올림 (예 : 소수점 이하 두 자리 자르기), 가장 가까운 반올림 및 반올림. 일반적으로 가장 가까운 반올림을 원합니다.

몇몇 다른 사람들이 지적했듯이, 부동 소수점 표현의 단점으로 인해이 둥근 값은 정확히 “명백한”소수 값이 아닐 수도 있지만 매우 가깝습니다.

반올림에 대한 자세한 내용, 특히 가장 가까운 반올림 규칙에 대한 자세한 내용은 반올림에 대한 Wikipedia 기사를 참조하십시오 .


답변

printf에서 % .2f 사용 소수점 2 자리 만 인쇄합니다.

예:

printf("%.2f", 37.777779);

산출:

37.77


답변

인쇄 가치를 반올림한다고 가정하면 Andrew ColesonAraK 의 대답이 맞습니다.

printf("%.2f", 37.777779);

그러나 내부 사용을 위해 숫자를 정확히 37.78로 반올림하려는 경우 (예 : 다른 값과 비교) 부동 소수점 숫자의 작동 방식으로 인해 좋은 생각이 아닙니다. 부동 소수점에 대해 동등 비교를 수행하려면 목표 값 +/- 시그마 값을 사용하십시오. 또는 숫자를 알려진 정밀도로 문자열로 인코딩하고 비교하십시오.

Greg Hewgill의 관련 질문에 대한 답변 링크를 참조하십시오. 여기에는 재무 계산에 부동 소수점을 사용하지 않아야하는 이유도 포함됩니다.


답변

이건 어때요:

float value = 37.777779;
float rounded = ((int)(value * 100 + .5) / 100.0);


답변

printf("%.2f", 37.777779);

C- 문자열에 쓰려면 :

char number[24]; // dummy size, you should take care of the size!
sprintf(number, "%.2f", 37.777779);


답변

반올림을 표현할 수 없기 때문에 a float를 다른 float것으로 반올림 하는 방법은 없습니다 float(부동 소수점 수의 제한). 예를 들어 37.777779를 37.78로 반올림하지만 가장 가까운 숫자는 37.781입니다.

그러나 형식 문자열 함수를 사용하여 a를 “둥글게” 할 수 있습니다float .


답변

또한 C ++를 사용하는 경우 다음과 같은 함수를 만들 수 있습니다.

string prd(const double x, const int decDigits) {
    stringstream ss;
    ss << fixed;
    ss.precision(decDigits); // set # places after decimal
    ss << x;
    return ss.str();
}

할 수 있습니다 후 어떤 이중 출력 myDoublen이와 같은 코드로 소수점 이후 장소 :

std::cout << prd(myDouble,n);