如何控制C printf%e中’e’后的指数位数?

我想控制C printf %e ‘e’后的指数位数?

例如,C printf("%e")结果为2.35e+03 ,但我想要2.35e+003 ,我需要3位指数,我该如何使用printf

码:

 #include int main() { double x=34523423.52342353; printf("%.3g\n%.3e",x,x); return 0; } 

结果: http //codepad.org/dSLzQIrn

 3.45e+07 3.452e+07 

我想要

 3.45e+007 3.452e+007 

但有趣的是,我在Windows中使用MinGW获得了正确的结果。

“……指数始终包含至少两位数字,并且只需要表示指数所需的位数。”C11dr§7.21.6.18

因此3.45e+07符合(OP不需要)和3.45e+007不符合(OP想要的)。

由于C没有提供代码来改变指数位数的标准方法,因此代码可以自行维持。

各种编译器支持一些控制。

visual studio _set_output_format

为了好玩,以下是DIY代码

  double x = 34523423.52342353; // - 1 . xxx e - EEEE \0 #define ExpectedSize (1+1+1 +3 +1+1+ 4 + 1) char buf[ExpectedSize + 10]; snprintf(buf, sizeof buf, "%.3e", x); char *e = strchr(buf, 'e'); // lucky 'e' not in "Infinity" nor "NaN" if (e) { e++; int expo = atoi(e); snprintf(e, sizeof buf - (e - buf), "%05d", expo); // 5 more illustrative than 3 } puts(buf); 3.452e00007 

另请参阅c ++如何使用printf获得“一位数指数”

printf格式标签原型:

 %[flags][width][.precision][length]specifier 

精度

…这给出了a,A,e,E,f和F转换的基数字符后出现的位数….

您正在使用转换和精度说明符,区别在于C库函数的实现和不同系统上的环境。 precision指定'.'后面的位数'.' (点,期间等)。 它不设置表示取幂的字符数。 它在Windows上提供3 digits的事实就是windows指定格式的方式,而不是C标准库指定printf将起作用的方式。

它需要比较源实现的不同之处,以查看格式字符串中所依赖的内容。 (它可能归结为windows v.linux / unix环境/ locale / etc的定义或指定方式中的一些模糊差异)