0

谁能解释一下 %g 和 %f 的区别。我知道 %0.2f 因为我知道它只在小数点后 2 位打印!我试过这个代码......

int main()
{
   float val = 10.0;
   printf("<%g><%0.2g><%0.4g><%f><%0.2f>", val, val, val, val, val);

   return 0;
}
//giving : <10><10><10><10.000000><10.00>

//If i give 10.1 instead!
int main()
{
   float val = 10.1;
   printf("<%g><%0.2g><%0.4g><%f><%0.2f>", val, val, val, val, val);

   return 0;
}
//giving : <10.1><10><10.1><10.000000><10.00>
// How come here i got for %g    --> 10.1
//                         %0.2g --> 10
//                         %0.4g --> 10.1

请有人澄清我!

4

2 回答 2

0

已在 Eclipse/Microsoft C 编译器环境中运行您的代码副本。

总体而言,%g 有两种可能的行为,一种是指数大于或等于 -4 时,如 1*10^-4 = 0.0001,另一种是指数 < -4,如 0.00001。

    // Microsoft C compiler "handles" void main()
    void main()
    {
      // Note. Exponent is 1
      float val = 10.0;
      printf("\n<%g><%0.2g><%0.4g><%f><%0.2f>", val, val, val, val, val);

      // Exponent is still 1
      val = 10.1;
      printf("\n<%g><%0.2g><%0.4g><%f><%0.2f>", val, val, val, val, val);

      // Exponent is -5, and the %g format specifier behaves as you expect
      val = 0.000011;
      printf("\n<%g><%0.2g><%0.4g><%f><%0.2f>", val, val, val, val, val);

      // output == <1.1e-005><1.1e-005><1.1e-005><0.000011><0.00>

    }

printf您的代码的行为与 ANSI C 标准所记录的一致,它的性能与您如何编写与main()语句无关的东西完全无关。

于 2013-08-03T18:55:49.943 回答
0

%g和的 Linux 程序员手册%G

double 参数以样式 f 或 e 进行转换(或 F 或 E 用于 G 转换)。 精度指定有效位数。 如果缺少精度,则给出 6 位数字;如果精度为零,则将其视为 1。如果从其转换得到的指数小于 -4 或大于或等于精度,则使用样式 e。从结果的小数部分中删除尾随零;只有在小数点后跟至少一位数字时才会出现小数点。

因此,在 . 是场宽;后 。是结果中有效数字的最大数量,但删除了尾随零。4 位有效数字的 10.10000 是 10.10,但去除尾随零的结果是 10.1。有 2 位有效数字,结果为 10。并且%g等于%.6g

但请注意第二部分:

如果其转换的指数小于 -4 或大于或等于精度,则使用样式 e。

这意味着 100 格式化%0.2g结果为1e+02

于 2013-08-03T16:37:56.207 回答