20

我想在C中将double转换为float,但想尽可能保留小数点而不做任何更改...

例如,假设我有

   double d = 0.1108;
   double dd = 639728.170000;
   double ddd = 345.2345678

如果我错了,现在纠正我,我知道浮点精度大约是点后的 5 个数字。我可以在点之后得到这五个数字,就像双精度一样吗?使上述结果如下:

   float f = x(d);
   float ff = x(dd);
   float fff = x(ddd);

   printf("%f\n%f\n%f\n", f, ff, fff);

它应该打印

   0.1108
   639728.17000
   345.23456

精度限制(我假设为 5)之后的所有数字都将被截断。

4

3 回答 3

37

float并且double不要存储小数位。它们存储二进制位:floatis(假设 IEEE 754)24 个有效位(7.22 个十进制数字),double 是 53 个有效位(15.95 个有效位)。

转换 from doubletofloat会给你最接近的可能float,所以四舍五入对你没有帮助。换一种方式可能会给你十进制表示中的“噪音”数字。

#include <stdio.h>

int main(void) {
    double orig = 12345.67;
    float f = (float) orig;
    printf("%.17g\n", f); // prints 12345.669921875
    return 0;
}

要获得double您想要的漂亮十进制值的近似值,您可以编写如下内容:

double round_to_decimal(float f) {
    char buf[42];
    sprintf(buf, "%.7g", f); // round to 7 decimal digits
    return atof(buf);
}
于 2010-08-17T00:53:21.777 回答
12

Afloat一般有大约 7 位的精度,与小数点的位置无关。因此,如果您想要小数点后 5 位的精度,则需要将数字的范围限制为小于 +/-100 左右。

于 2010-08-16T23:34:34.477 回答
-3

浮点数以科学记数法表示为一个只有七个有效数字的数字乘以一个更大的数字,该数字代表小数位的位置。维基百科上关于它的更多信息:

http://en.wikipedia.org/wiki/Floating_point

于 2010-08-16T23:38:38.493 回答