【发布时间】:2015-09-28 16:03:15
【问题描述】:
我想控制 C printf %e 中 'e' 之后的指数位数?
比如Cprintf("%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;
}
结果: http://codepad.org/dSLzQIrn
3.45e+07
3.452e+07
我想要
3.45e+007
3.452e+007
但有趣的是,我在 Windows 中使用 MinGW 得到了正确的结果。
【问题讨论】:
-
“Windows”行为不符合标准,VS2015 默认使用至少 2 个指数位(参见exponent formatting)。
-
@cremno 关于指数宽度的“Windows”不符合标准是什么?除了符合或不符合OP的目标吗?
-
@cremno 我看到“...指数始终包含至少两位数字,并且仅包含表示指数所需的更多数字。...”§7.21.6.1
-
@chux:是的,这就是它不符合 C99/C11 的原因。理由还包括:“对于
%e,C99 阐明了小指数至少包含 2 位数字,但不超过表示值所必需的数字。在 C99 之前,不清楚是否允许任意数量的前导零。” -
@cremno 太糟糕了,在 C99 的时候没有定义一个控制机制来解决这个问题。 IMO,至少 2 是一个奇怪的选择 - 可能是现有技术。 至少,规范应该定义一个预期最大宽度的常数。这将有助于调整
"%e"缓冲区的大小。其他代码需要ilog10(DBL_MAX_10_EXP)+1之类的东西。感谢您的洞察力。