有没有一个函数来循环在C中的float或我需要写我自己的?

有没有一个函数来循环在C中的float或我需要写我自己的?

float conver = 45 59 2346543;

我想将实际值四舍五入到小数点后一位,收敛= 45。

正如罗布所说,你可能只想打印浮点数到小数点后1位。 在这种情况下,你可以做如下的事情:

#include <stdio.h> #include <stdlib.h> int main() { float conver = 45.592346543; printf("conver is %0.1f\n",conver); return 0; } 

如果你想要实际存储的价值,这有点复杂。 首先,你的一位小数位表示很less会有一个精确的浮点数模拟。 如果你只是想尽可能接近,像这样的事情可能会诀窍:

 #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; } 

我怀疑这第二个例子是你在找什么,但我包括它的完整性。 如果您确实需要在内部以这种方式表示数字,而不仅仅是输出,请考虑使用定点表示 。

当然,你可以使用roundf() 。 如果你想四舍五入到一位小数,那么你可以做这样的事情: roundf(10 * x) / 10

只是为了概括一下Rob的回答,如果你不是在输出,你仍然可以使用与sprintf()相同的接口。

不过,我认为还有另一种方法可以做到这一点。 您可以尝试ceil()floor()来上下滚动。 一个很好的诀窍就是增加0.5,所以超过0.5的任何东西都会被舍去,但是任何东西都会被舍去。 ceil()floor()只能在double s上工作。

编辑:另外,对于浮动,您可以使用truncf()截断浮动。 相同的+0.5技巧应该能够做精确的舍入。

有一个round()函数,也是fround() ,它将四舍五入到最接近的整数expression为double。 但那不是你想要的。

我有同样的问题,并写道:

 #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; } 
 #include <math.h> double round(double x); float roundf(float x); 

不要忘记链接-lm。 另请参阅ceil(),floor()和trunc()。

你可以使用#define round(a)(int)(a + 0.5)作为macros,所以每当你写回合(1.6)时它返回2,每当你写回合(1.3)它返回1。

打印一个四舍五入的值, @Matt J很好的回答了这个问题。

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

由于大多数浮点(FP)是基于二进制的,当math上正确的答案是x.1, x.2, ...时,不可能精确四舍五入到小数点后一位。

将FP编号转换为最接近的 0.1是另一回事。

溢出 :首先由10(或100,1000等)缩放的方法可能会溢出大x

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

双舍入 :当中间和x*10.0f + 0.5f 舍入到一个新整数时,加0.5f然后使用floorf(x*10.0f + 0.5f)/10.0返回错误的结果。

 // 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; } 

float xINT_MAX大得多时,将其转换int会有明显的问题。


使用roundf()和family,可用<math.h>是最好的方法。

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

为了避免使用double ,只需testing一下数字是否需要四舍五入。

 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; }