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

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

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

double转换为float将为您提供最接近的float ,因此舍入对您没有帮助。 走另一条路可能会给出十进制表示中的“噪音”数字。

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

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

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

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