我们希望将double值转换为字符串时保留最多10位小数。当我们尝试使用%e或%f时,它们不会保留超过5位小数。当我们尝试%.14f时,小于1.0e-20的小值没有被正确转换为字符串。请问应该使用什么格式字符串来保留double值的最多10位小数?
%.17g
来打印与所涉及的双精度最匹配的格式。printf("%.17g\n", 10000.);
printf("%.17g\n", 240.0008);
printf("%.17g\n", 0.0000000013);
10000
240.0008
1.3000000000000001e-009
float
类型(单精度浮点数)只能保留六位小数精度。没有转换说明符可以增加本来不存在的精度...(顺便说一句,double
类型保留约15位精度。)如果数字比较小,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
%.10g
吗? - Adeel Ahmed