双10小数点精度

时间:2012-12-18 10:35:48

标签: c++ c visual-studio-2010

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

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

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

3 个答案:

答案 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;
}