对于数字的指数部分,有没有办法用科学记数法打印少于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.
小智 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"部分,这样您就可以使用任何您想要使用的科学记数法输出原始部分.