printf(),fprintf()中的十进制精度与位数的关系,格式为%g与%f

时间:2016-03-19 17:50:44

标签: c printf string-formatting

冲浪一段时间后,我找不到这个问题的明确解释。也许任何人都可以澄清为什么它如此有用。

在某些代码中,我通过double(正确初始化文件流后)将一些fprintf个数字保存到文件中。因为,先验,我不知道我的程序传递了什么号码,特别是它的格式是什么,例如0.000111.1e-4,我想使用格式说明符%.5g而不是%.5f,其中,我希望以5位十进制精度保存我的数据。< / p>

然而,事实证明,在%g中,如果数字的整数部分等于0,则我保存的数字的小数精度是正确的,否则不是,例如:

FILE *fp;
fp = fopen("mydata.dat","w+"); //Neglecting error check for brevity
double value[2] = {0.00011,1.00011};
printf("\ng-format\n");
for(int i=0;i<2;i++){ 
    frintf(fp,"%.5g\n",value[i]);
    printf("%.5g\n",value[i]);
}
printf("\n\nf-format\n");
for(int i=0;i<2;i++){
    frintf(fp,"%.5f\n",value[i]);
    printf"%.5f\n",value[i]);
} 
fclose(fp);

这会产生以下输出到文件(和std流):

g-format
0.00011
1.0001

f-format
0.00011
1.00011 

那么,一旦整数部分不为零,为什么选择%g是'吃'小数位?

3 个答案:

答案 0 :(得分:1)

它不是吃十进制数字。使用%g,字段宽度指定有效位数; 1.0001有5位有效数字,这是“%.5g”的要求。这与%f不同,其中字段宽度指定小数点右侧的位数。

答案 1 :(得分:1)

%g从第一个数字打印x个数字,而不是0。 因此,如果x + 1数字不在整数部分,它将围绕它。如果x + 1数字在整数部分,它将显示您的数字作为科学记数法(也是圆形)

%f只显示整数部分加上x位后的数字。

答案 2 :(得分:0)

回答看似OP更高的问题:

  

我想以5位十进制精度保存我的数据。

如果代码需要保存具有6个有效数字的值,请使用.5e,它将使用非零前导数字打印所有值*,并使用指数表示法打印小数点后5位。不要打扰"%g"

*当然,0.0的值不会以前导非零数字打印。