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

use*_*024 8 c printf

我想控制C中'e'后的指数位数printf %e

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

码:

#include<stdio.h>
int main()
{
    double x=34523423.52342353;
    printf("%.3g\n%.3e",x,x);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

结果: http ://codepad.org/dSLzQIrn

3.45e+07
3.452e+07
Run Code Online (Sandbox Code Playgroud)

我想要

3.45e+007
3.452e+007
Run Code Online (Sandbox Code Playgroud)

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

chu*_*ica 7

"......指数始终包含至少两位数字,并且只需要表示指数的数字."C11dr§7.21.6.18

因此3.45e+07符合(OP不想要的)并且3.45e+007不符合(OP想要的).

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

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

视觉工作室 _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
Run Code Online (Sandbox Code Playgroud)

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