冲浪一段时间后,我找不到这个问题的明确解释。也许任何人都可以澄清为什么它如此有用。
在某些代码中,我通过double
(正确初始化文件流后)将一些fprintf
个数字保存到文件中。因为,先验,我不知道我的程序传递了什么号码,特别是它的格式是什么,例如0.00011
与1.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
是'吃'小数位?
答案 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
的值不会以前导非零数字打印。