2010-08-16 114 views
17

我想转换双浮在C,但要准确地保留小数点没有任何变化......C:double转换成浮动,保留小数点精度

例如,比方说,我有

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)将被截断。

+8

浮点精度更准确地表述为“的显著位数”,而不是“数小数点后的位数'。漂浮物很可能不会特别准确地代表12345678.12345。 – 2010-08-16 23:25:52

+8

除了关于浮点数的表示方式的错误理解之外,您正在寻找的函数'x'是从double到float'(float)'的类型转换。如果您没有将舍入模式从最接近偶数的默认值更改,则此演算计算最接近您要转换的“double”的“浮点数”。没有比这个更好的转换,所以如果这个失去了太多的精度,你的味道,保持你的'双',因为它们。 – 2010-08-16 23:56:40

+2

截断不是最准确的方法来转换他们 - 345.2345678 更接近345.23457比345.23456 – caf 2010-08-17 00:00:25

回答

26

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); 
} 
+0

@davidvandebunte:这只是在C++中。这个问题被标记为C. – dan04 2017-12-11 22:08:59

11

A float一般约有7位数的精度,不管小数点的位置如何。所以如果你想在小数点后5位数字的精度,你需要限制数字的范围小于+/- 100左右。