浏览了一段时间没有找到这个问题的明确解释。也许任何人都可以向我解释为什么它如此有效。
在一些代码中我保存了一些double
归档号码 fprintf
(正确初始化文件流后)。因为,先验地,我不知道传递给我的程序的数字是什么,特别是它的格式是什么,例如0.00011
与 1.1e-4
,我想使用格式说明符 %.5g
而不是%.5f
,其中,我想以 5 位小数精度保存数据。
然而,事实证明在 %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
是不是只要整数部分不为零就“吃掉”小数位?
最佳答案
%g 从第一个不为 0 的数字开始打印 x 个数字。 因此,如果 x + 1 数字不在整数部分,则会四舍五入。如果 x + 1 数字位于整数部分,它将以科学记数法显示您的数字(也四舍五入)
%f只显示整数部分加上后面的x位。
关于c - 小数精度与 printf()、fprintf() 格式 %g 与 %f 中的位数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36105101/