有没有一个函数来循环在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 x
比INT_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; }