3

我们希望确保在将双精度值转换为字符串时保留最多 10 个小数点值。

当我们尝试 %e 或 %f 时,它不会保留超过 5 个小数点。当我们尝试 %.14f 时,小值(小于 1.0e-20)没有正确转换为字符串。

什么格式的字符串用于为双精度值保留最多 10 个小数点?

4

3 回答 3

6

尝试%.17g以最合适的格式打印有问题的双精度。

printf("%.17g\n", 10000.);
printf("%.17g\n", 240.0008);
printf("%.17g\n", 0.0000000013);

10000
240.0008
1.3000000000000001e-009
于 2012-12-18T10:41:36.150 回答
2

我希望你知道类型float(单精度浮点)只能保持六位小数的精度?没有任何转换说明符可以给出开始时不存在的精度......(该double类型保持大约 15 位精度,仅供参考。)

链接:http ://en.wikipedia.org/wiki/Floating_point#Internal_representation

更新: JasonD 有您更新问题的答案。保持这一点以备不时之需。

于 2012-12-18T10:39:34.743 回答
1

浮点数只有在数字很小的情况下才能存储这个十进制数,否则使用双精度数。

在这个例子中%.17g并且 %.14f工作没有问题:

#include <stdio.h>

int main(void)
{
        double v = 0.12345678912345;
        printf("%.17g   %.14f  \n", v, v);
        return 0;
}

显示结果:

0.12345678912345   0.12345678912345

从文档

f:十进制浮点数,小写 392.65

e:科学计数法(尾数/指数),小写 3.9265e+2

g:使用最短的表示: %e 或 %f 392.65

所以使用%.14f它很好

编辑:

小值(小于 1.0e-20)未正确转换为字符串。

显示多于20的十进制,你应该使用long double... 但是如果你只需要存储1.0e-20而不需要打印多于6的十进制,float可以容纳它。

对于 long double,您需要使用类似%.21Lg. 例如 :

#include <stdio.h>

int main(void)
{
        long double v = 0.123456789123456789123456789;
        printf("%.21Lg   %.21Lf   \n", v, v);
        return 0;
}
于 2012-12-18T10:39:46.077 回答