printf的意外输出为浮点值10.1

时间:2013-08-03 16:18:27

标签: c formatting

任何人都可以解释%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

请有人澄清我!

2 个答案:

答案 0 :(得分:0)

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

  

双参数以样式f或e(或G或E转换为G转换)转换。 精度指定重要数量   数字。如果缺少精度,则给出6位数字;如果精度为零,则将其视为1.如果指数来自其,则使用样式e   转化率小于-4或大于或等于   精确度。尾随零从结果的小数部分中删除;只有小数点才出现   之后至少有一位数。

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

但请注意第二部分:

  

如果指数来自它,则使用样式e   转化率小于-4或大于或等于   精确度。

这意味着使用%0.2g格式化的100会产生1e+02

答案 1 :(得分:0)

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

总的来说,%g有两种可能的行为,一种是指数大于或等于-4,一种是1 * 10 ^ -4 = 0.0001,另一种是当指数<1时。 -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>

    }

您的代码的行为与ANSI C标准一致,其性能与您将printfmain()语句无关的内容编码完全无关。