如何控制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的定义或指定方式中的一些模糊差异)