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

sdf*_*dfg 19 c floating-point double c89

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

例如,假设我有

   double d = 0.1108;
   double dd = 639728.170000;
   double ddd = 345.2345678
Run Code Online (Sandbox Code Playgroud)

现在纠正我,如果我错了,我知道浮点精度大约是点后的5个数字.我可以在双点之后得到那五个数字吗?以上结果如下:

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

   printf("%f\n%f\n%f\n", f, ff, fff);
Run Code Online (Sandbox Code Playgroud)

它应该打印

   0.1108
   639728.17000
   345.23456
Run Code Online (Sandbox Code Playgroud)

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

dan*_*n04 29

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

转换doublefloat将给你最接近的可能float,所以舍入不会帮助你.走另一条路可能会给出十进制表示中的"噪音"数字.

#include <stdio.h>

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

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

double round_to_decimal(float f) {
    char buf[42];
    sprintf(buf, "%.7g", f); // round to 7 decimal digits
    return atof(buf);
}
Run Code Online (Sandbox Code Playgroud)

  • 在 `round_to_decimal` 中遍历一个字符串似乎是一个可怕的想法。当然,一定有更好的方法来用一些数学来做到这一点。 (5认同)

Mic*_*urr 11

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