C 从格式说明符';%开始g';对于双开始指数格式打印

C 从格式说明符';%开始g';对于双开始指数格式打印,c,printf,C,Printf,我想了解double的格式说明符%g何时开始以指数格式打印值 myTest.c #include <stdio.h> int main() { double val = 384615.38462; double val2 = 9999999; printf ("val = %g\n",val); printf ("val2 = %g\n",val2); return 0; } 输出: val = 384615 val2 = 1e+07 问题: 为什么val

我想了解double的格式说明符
%g
何时开始以指数格式打印值

myTest.c

#include <stdio.h>

int main() {

  double val = 384615.38462;
  double val2 = 9999999;
  printf ("val = %g\n",val);
  printf ("val2 = %g\n",val2);
  return 0;
}
输出:

val = 384615
val2 = 1e+07
问题: 为什么
val
被打印为整数,为什么
val2
被转换为指数格式,即使我没有在
printf
中使用
%lf

是否存在从何时开始使用指数格式打印值的范围?如果是的话,我们有没有办法猜测数值范围


提前感谢。

根据
man 3 printf

g、 g

双参数转换为f或e样式(或f或e表示G转换)。精度指定有效位数。如果缺少精度,则给出6位数字;如果精度为零,则将其视为1<如果转换后的指数小于-4或大于或等于精度,则使用strong>样式e。从结果的小数部分删除尾随零;小数点后至少有一位数字时才会出现

以及C11–ISO/IEC 9899:2011标准草案N1570():

g、 g

表示浮点数的双参数在中转换 样式f或e(或在G转换说明符的情况下为样式f或e), 取决于转换的值和精度。让P等于 如果精度不为零,则精度为6;如果精度为零,则精度为1。 然后,如果样式为E的转换的指数为X:

-如果p>X≥ −4、转换方式为f(或f)和精度 P− (X+1)。

-否则,将使用样式e(或e)和精度p进行转换− 一,

最后,除非使用#标志,否则将从 如果出现以下情况,则删除结果的小数部分和小数点字符 没有剩余的部分了。 表示无穷大或NaN的双参数在样式中转换 f或f转换说明符的

警察说

g,g

双参数转换为f或e样式(或f或e表示G转换)。精度指定有效位数。如果缺少精度,则给出6位数字;如果精度为零,则将其视为1<如果转换后的指数小于-4或大于或等于精度,则使用strong>样式e。从结果的小数部分删除尾随零;小数点后至少有一位数字时才会出现


那么,DV:你能给我点击率吗。。。?
val = 384615
val2 = 1e+07