C로 float을 반올림하는 함수가 있습니까? 아니면 직접 작성할 필요가 있습니까?C로 float을 반올림하는 함수가 있습니까? 아니면 직접 작성할 필요가 있습니까?
floatconvert = 45. 2346543;
I는 소수점 한자리, Conver 유럽 = 45 6에 실제 값을 라운딩하고 싶다.
C로 float을 반올림하는 함수가 있습니까? 아니면 직접 작성할 필요가 있습니까?C로 float을 반올림하는 함수가 있습니까? 아니면 직접 작성할 필요가 있습니까?
floatconvert = 45. 2346543;
I는 소수점 한자리, Conver 유럽 = 45 6에 실제 값을 라운딩하고 싶다.
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을 사용하는 것이 좋습니다.
#include <math.h>
double round(double x);
float roundf(float x);
-lm으로 링크하는 것을 잊지 마십시오. ceil(), floor() 및 trunc()도 참조하십시오.
가장 가까운 정수로 반올림합니다 ... 그가 요구 한 것이 아닙니다. –
맞아, 나 자신보다 앞서있어. 나는 에드워드의 대답에 투표했다. –
roundf()을 사용할 수 있습니다. roundf(10 * x)/10
좋은 점은, Asker가 가장 가까운 정수로 반올림하도록 요청하지 않았다는 사실을 다른 사람들은 모두 무시했습니다. 부동 소수점의 부정확성 때문에주의해야합니다. 인쇄 할 때 예제를 보면 "45.59999"가 보일 것입니다. –
더 좋은 해결책은 다음과 같습니다. double f (double x, int decimal_points) {int n = pow (10, decimal_points); return roundf (n * x)/n; } –
해결되지 않은 외부 기호 _roundf가 _f 에 포함되어 있지만 math.h가 포함되어 있지만 roundf()가 마음에 들지 않습니다. VS .NET에 있는데, Linux 용으로 만 찾았습니까? –
그냥 당신이 출력에 그 일을 하지이라면, 조금 롭의 답변을 일반화하기 위해, 당신은 여전히 sprintf()
와 같은 인터페이스를 사용할 수 있습니다 : 당신은 소수점 반올림 할 경우에, 당신은 뭔가를 할 수 .
내가 할 수있는 또 다른 방법이 있다고 생각합니다. ceil()
및 floor()
을 반올림하여 반올림 할 수 있습니다. 좋은 트릭은 0.5를 더하는 것이므로 0.5 이상은 반올림하지만 그 아래의 것은 반올림합니다. ceil()
및 floor()
은 double
에 대해서만 작동합니다.
편집 : 또한 부동 소수점의 경우 truncf()
을 사용하여 부동 소수점을자를 수 있습니다. 정확한 반올림을 수행하려면 +0.5 트릭이 필요합니다.
round()
함수도 있고 fround()
이 있으며 가장 가까운 정수로 반올림됩니다. 그러나 그것은 당신이 원하는 것이 아닙니다.
#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;
}
당신이 #DEFINE 라운드 (A) (int)를 사용할 수있다 (A + 0.5) 2를 쓰고 라운드 (1.3)을 쓸 때마다 1을 반환합니다.
인쇄 반올림 된 값은 @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 x
이 INT_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;
}
반 내림은 정상적으로 작동하지만 반올림 45.569346543; 45.599998 .... 45.5 * 1.0f .... 나는 더 가까운 생각이고 바닥과 천장을 다시 읽을 필요가있다. 고마워. –
그것은 부동 소수점 부정확도에서오고있다, 나는 두 배로 변경, 잘 작동합니다. 감사. –
Matt J의 폐점 의견을 반복해서 말씀 드리고자합니다. 45.6은 어떤 이진 부동 소수점 형식으로도 정확하게 표현 될 수 없으므로 이중 저장을 사용하는 경우에도 저장 대상이 아닙니다. 프로그램이 "45.6"을 출력하고 있다면 출력 루틴이 그것을 반올림하기 때문입니다. – Spike0xff