c ++如何使用printf获得"一位数指数"

Kri*_*s_R 12 c++ wxwidgets

对于数字的指数部分,有没有办法用科学记数法打印少于3个位置?6.1格式不会影响指数,只会影响数字部分:

var=1.23e-9;
printf ("%e\n", var);
printf ("%6.1e\n", var);
Run Code Online (Sandbox Code Playgroud)

1.230000e-009
1.2e-009
Run Code Online (Sandbox Code Playgroud)

我也在wxWidgets中尝试过这种格式化字符串,但行为是一样的.

m_var->SetLabel(wxString::Format(wxT("%6.1e"),var));
Run Code Online (Sandbox Code Playgroud)

我想拥有的是1.2e-9.

Ily*_*gan 12

根据维基百科:

指数始终包含至少两位数; 如果值为零,则指数为00.在Windows中,指数默认包含三位数,例如1.5e002,但这可以由特定于Microsoft的_set_output_format函数更改.

_set_output_format


小智 6

我必须做很多事情(我编写文件解析器和一些像NITF这样的文件格式要求你将数值存储为字符串).

你所做的是基于什么基数为10的数学(科学记数法)的实际意义:它意味着对于所有实数y,y =(x)*10 ^(N)对于某个整数N和某些x在范围内(-1,1)独家.

所以,你做了以下几点

void PrintScientific(double d)
{
   int exponent  = (int)floor(log10( fabs(d)));  // This will round down the exponent
   double base   = d * pow(10, -1.0*exponent);

   printf("%lfE%+01d", base, exponent);
}
Run Code Online (Sandbox Code Playgroud)

您可以添加所需的所有格式说明符,以便在"."之后控制字符数.小数位.

不要忘记舍入步骤!这是它的工作原理,使用base10和logarithms的属性(这里为10):

设y = x*10 ^ N =>
log(y)= log(x*10 ^ N)=>
log(y)= log (x)+ log(10 ^ N)=> //来自Log"product"规则
log(y)= log(x)+ N

由于x在(-10,10)范围内 - "()"表示异或(不包括),这意味着log(x)在范围(-1,1)中.因此,当我们向下舍入进行整数转换时,我们将丢弃"log(x)"贡献.然后,您可以从原始编号中获取"x"部分,这样您就可以使用任何您想要使用的科学记数法输出原始部分.