我们希望确保在将双精度值转换为字符串时保留最多 10 个小数点值。
当我们尝试 %e 或 %f 时,它不会保留超过 5 个小数点。当我们尝试 %.14f 时,小值(小于 1.0e-20)没有正确转换为字符串。
什么格式的字符串用于为双精度值保留最多 10 个小数点?
我们希望确保在将双精度值转换为字符串时保留最多 10 个小数点值。
当我们尝试 %e 或 %f 时,它不会保留超过 5 个小数点。当我们尝试 %.14f 时,小值(小于 1.0e-20)没有正确转换为字符串。
什么格式的字符串用于为双精度值保留最多 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 位精度,仅供参考。)
链接:http ://en.wikipedia.org/wiki/Floating_point#Internal_representation
更新: JasonD 有您更新问题的答案。保持这一点以备不时之需。
浮点数只有在数字很小的情况下才能存储这个十进制数,否则使用双精度数。
在这个例子中%.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;
}