C:将double转换为float,保留小数点精度

时间:2010-08-16 23:22:17

标签: c floating-point double c89

我想在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)都将被截断。

3 个答案:

答案 0 :(得分:28)

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

double转换为float会为您提供最接近的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);
}

答案 1 :(得分:11)

无论小数点的位置如何,float通常具有大约7位精度。因此,如果您想要小数点后的5位精度,则需要将数字的范围限制在+/- 100左右。

答案 2 :(得分:-2)

浮点数用科学计数法表示为只有七位有效数字的数字乘以代表小数位数的较大数字。 有关维基百科的更多信息:

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