双精度10位小数精度

3
我们希望将double值转换为字符串时保留最多10位小数。当我们尝试使用%e或%f时,它们不会保留超过5位小数。当我们尝试%.14f时,小于1.0e-20的小值没有被正确转换为字符串。请问应该使用什么格式字符串来保留double值的最多10位小数?

你试过 %.10g 吗? - Adeel Ahmed
这是一个关于将双精度浮点数转换为字符串的编程问题,可能对你有用。 - Adeel Ahmed
3个回答

6
尝试使用%.17g来打印与所涉及的双精度最匹配的格式。
printf("%.17g\n", 10000.);
printf("%.17g\n", 240.0008);
printf("%.17g\n", 0.0000000013);

10000
240.0008
1.3000000000000001e-009

2
我希望你知道,float类型(单精度浮点数)只能保留六位小数精度。没有转换说明符可以增加本来不存在的精度...(顺便说一句,double类型保留约15位精度。)
链接:http://en.wikipedia.org/wiki/Floating_point#Internal_representation 更新:JasonD已经回答了你的更新问题。为了记录,我保留此信息。

我正在寻找双精度值转换。已更新我的帖子。 - Maanu

1

如果数字比较小,float可以存储这个数字的小数部分,否则请使用double。

在这个例子中,%.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;
}

不,你不需要使用 long double 来存储/显示 1.0e-20。即使是简单的 float 类型也可以存储小至 1.0e-37 (FLT_MIN) 的值... - DevSolar
实际上,如果值很小,一个简单的浮点数就可以容纳它...我将修复它。 - benjarobin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接