c - 小数精度与 printf()、fprintf() 格式 %g 与 %f 中的位数

标签 c printf string-formatting

浏览了一段时间没有找到这个问题的明确解释。也许任何人都可以向我解释为什么它如此有效。

在一些代码中我保存了一些double归档号码 fprintf (正确初始化文件流后)。因为,先验地,我不知道传递给我的程序的数字是什么,特别是它的格式是什么,例如0.000111.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/

相关文章:

c - printf(3 +"excellent"+4) 这行代码如何运行?

python - 如何在 str.format() 中使用宽度和精度变量?

.net - .NET 中的字符串格式 : convert integer to fixed width string?

c - 将遗留 C 代码(与全局变量的广泛使用紧密结合)重构为共享库

c - 从不断更新的文件中读取

c++ - 从一个论点到两个 - 在编译时

c - 在控制台上写入和在 C 中写入文件时的输出差异

python - % python 中的字符串运算符

c - 套接字编程-简单的客户端/服务器

c - 指向结构的指针数组,调试时只有 SIGSEGV