我们希望确保在将double值转换为字符串时保留最多10个小数点值。
当我们尝试%e或%f时,它不会保留超过5个小数点。 当我们尝试%。14f时,小值(小于1.0e-20)未正确转换为字符串。
用于为双值保留最多10个小数点的格式字符串是什么?
答案 0 :(得分:5)
尝试%.17g
以最合适的双重格式打印。
printf("%.17g\n", 10000.);
printf("%.17g\n", 240.0008);
printf("%.17g\n", 0.0000000013);
10000
240.0008
1.3000000000000001e-009
答案 1 :(得分:2)
我希望你做知道float
类型(单精度浮点)只有保持精度的六位小数?没有转换说明符可以提供不存在的精度......(double
类型保持大约15位精度,FYI。)
链接:http://en.wikipedia.org/wiki/Floating_point#Internal_representation
更新:JasonD可以回答您的更新问题。保持这种可靠性。
答案 2 :(得分: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;
}