2009-01-30 4 views

답변

23

Rob이 언급 한대로 인쇄 소수점 이하 1 자리까지만 인쇄하면됩니다. 이 경우 다음과 같이 할 수 있습니다.

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
    float conver = 45.592346543; 
    printf("conver is %0.1f\n",conver); 
    return 0; 
} 

실제로 저장된 값을 반올림하려는 경우 조금 복잡합니다. 하나의 소수 자릿수 표현은 부동 소수점에서 정확한 아날로그를 거의 갖지 않습니다. 그냥 최대한 가까이하려면이 같은 트릭을 할 수 있습니다

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

int main() 
{ 
    float conver = 45.592346543; 
    printf("conver is %0.1f\n",conver); 

    conver = conver*10.0f; 
    conver = (conver > (floor(conver)+0.5f)) ? ceil(conver) : floor(conver); 
    conver = conver/10.0f; 

    //If you're using C99 or better, rather than ANSI C/C89/C90, the following will also work. 
    //conver = roundf(conver*10.0f)/10.0f; 

    printf("conver is now %f\n",conver); 
    return 0; 
} 

나는이 두 번째 예는 당신이 찾고있는 무엇을 의심하지 않지만, 나는 완전성을 위해 포함되어 있습니다. 이 방법으로 숫자를 내부적으로 표현해야하는 경우에만 출력이 아니라 fixed-point representation을 사용하는 것이 좋습니다.

+0

반 내림은 정상적으로 작동하지만 반올림 45.569346543; 45.599998 .... 45.5 * 1.0f .... 나는 더 가까운 생각이고 바닥과 천장을 다시 읽을 필요가있다. 고마워. –

+0

그것은 부동 소수점 부정확도에서오고있다, 나는 두 배로 변경, 잘 작동합니다. 감사. –

+0

Matt J의 폐점 의견을 반복해서 말씀 드리고자합니다. 45.6은 어떤 이진 부동 소수점 형식으로도 정확하게 표현 될 수 없으므로 이중 저장을 사용하는 경우에도 저장 대상이 아닙니다. 프로그램이 "45.6"을 출력하고 있다면 출력 루틴이 그것을 반올림하기 때문입니다. – Spike0xff

1
#include <math.h> 

double round(double x); 
float roundf(float x); 

-lm으로 링크하는 것을 잊지 마십시오. ceil(), floor() 및 trunc()도 참조하십시오.

+0

가장 가까운 정수로 반올림합니다 ... 그가 요구 한 것이 아닙니다. –

+0

맞아, 나 자신보다 앞서있어. 나는 에드워드의 대답에 투표했다. –

27

roundf()을 사용할 수 있습니다. roundf(10 * x)/10

+1

좋은 점은, Asker가 가장 가까운 정수로 반올림하도록 요청하지 않았다는 사실을 다른 사람들은 모두 무시했습니다. 부동 소수점의 부정확성 때문에주의해야합니다. 인쇄 할 때 예제를 보면 "45.59999"가 보일 것입니다. –

+0

더 좋은 해결책은 다음과 같습니다. double f (double x, int decimal_points) {int n = pow (10, decimal_points); return roundf (n * x)/n; } –

+0

해결되지 않은 외부 기호 _roundf가 _f 에 포함되어 있지만 math.h가 포함되어 있지만 roundf()가 마음에 들지 않습니다. VS .NET에 있는데, Linux 용으로 만 찾았습니까? –

1

그냥 당신이 출력에 그 일을 하지이라면, 조금 롭의 답변을 일반화하기 위해, 당신은 여전히 ​​sprintf()와 같은 인터페이스를 사용할 수 있습니다 : 당신은 소수점 반올림 할 경우에, 당신은 뭔가를 할 수 .

내가 할 수있는 또 다른 방법이 있다고 생각합니다. ceil()floor()을 반올림하여 반올림 할 수 있습니다. 좋은 트릭은 0.5를 더하는 것이므로 0.5 이상은 반올림하지만 그 아래의 것은 반올림합니다. ceil()floor()double에 대해서만 작동합니다.

편집 : 또한 부동 소수점의 경우 truncf()을 사용하여 부동 소수점을자를 수 있습니다. 정확한 반올림을 수행하려면 +0.5 트릭이 필요합니다.

+0

플로트에 대해 각각'ceilf()'와'floorf()'와'roundf()'를 사용할 수 있습니다. – uchuugaka

+0

"좋은 트릭은 0.5를 더하는 것입니다."많은 경우 실패합니다. [주석 참조] (http://stackoverflow.com/questions/497018/is-there-a-function-to-round-a-float-in -c-do-do-i-need-to-write-my-own # comment57895810_497037). – chux

1

round() 함수도 있고 fround()이 있으며 가장 가까운 정수로 반올림됩니다. 그러나 그것은 당신이 원하는 것이 아닙니다.

은 저도 같은 문제를 겪고이 쓴 : 당신은 라운드 (1.6)가 반환 쓰기 때문에 때마다 매크로 로

#include <math.h> 

    double db_round(double value, int nsig) 
/* =============== 
** 
** Rounds double <value> to <nsig> significant figures. Always rounds 
** away from zero, so -2.6 to 1 sig fig will become -3.0. 
** 
** <nsig> should be in the range 1 - 15 
*/ 

{ 
    double  a, b; 
    long long i; 
    int  neg = 0; 


    if(!value) return value; 

    if(value < 0.0) 
    { 
     value = -value; 
     neg = 1; 
    } 

    i = nsig - log10(value); 

    if(i) a = pow(10.0, (double)i); 
    else a = 1.0; 

    b = value * a; 
    i = b + 0.5; 
    value = i/a; 

    return neg ? -value : value; 
} 
0

당신이 #DEFINE 라운드 (A) (int)를 사용할 수있다 (A + 0.5) 2를 쓰고 라운드 (1.3)을 쓸 때마다 1을 반환합니다.

0

인쇄 반올림 된 값은 @Matt J입니다.수학적 정답은 x.1, x.2, ... 때 하나 개 소수점 장소로 반올림


대부분의 부동 소수점 (FP)를 기반으로 이므로

float x = 45.592346543; 
printf("%0.1f\n", x); // 45.6 

, 정확한 수 없습니다.

으로 가장 가까운0.1으로 FP 번호를 변환하는 것은 다른 문제입니다.

오버플로 : x 일 경우 첫 번째 배율을 10 (또는 100, 1000 등)만큼 오버플로 할 수 있습니다. 더블 반올림

float round_tenth1(float x) { 
    x = x * 10.0f; 
    ... 
} 

: 0.5F를 추가하고 floorf(x*10.0f + 0.5f)/10.0를 사용하여 잘못된 결과를 반환 할 때 새로운 정수까지 중간 합계 x*10.0f + 0.5f 라운드. float xINT_MAX보다 훨씬 큰 경우 int 주조

// Fails to round 838860.4375 correctly, comes up with 838860.5 
// 0.4499999880790710449 fails as it rounds to 0.5 
float round_tenth2(float x) { 
    if (x < 0.0) { 
    return ceilf(x*10.0f + 0.5f)/10.0f; 
    } 
    return floorf(x*10.0f + 0.5f)/10.0f; 
} 

은 분명 문제가있다. <math.h>에서 사용할 수 roundf()와 가족, 사용


는 가장 좋은 방법입니다.

float round_tenthA(float x) { 
    double x10 = 10.0 * x; 
    return (float) (round(x10)/10.0); 
} 

double을 사용하지 않으려면 숫자를 반올림해야하는지 테스트하십시오.

float round_tenthB(float x) { 
    const float limit = 1.0/FLT_EPSILON; 
    if (fabsf(x) < limit) { 
    return roundf(x*10.0f)/10.0f; 
    } 
    return x; 
} 
관련 문제