如何让ss<<像printf一样工作("%g",f);

时间:2016-02-24 01:31:53

标签: c++ printf

在我的C ++程序中,初始代码是

stringstream ss;
vector<float>::iterator v;
ss << std::left << std::setw(12) << std::setiosflags(std::ios::fixed)
                << std::setprecision(6) << *v;

但是对于某些v,例如2345999998888.44445332222,输出会很长。所以我想要那个

ss << *v

具有与

相同的效果
printf("%g", f);

以后,我刚刚使用ss << *v。令人惊讶的是,输出与%g相同。

stringstream会自动选择更好的输出值的方法吗?或者我只是犯了一个棘手的错误?

1 个答案:

答案 0 :(得分:2)

%g documented如下:

  

根据值和精度将浮点数转换为十进制或十进制指数表示法。

     

对于 g 转换样式,将执行样式 e f 的转换。

     

对于 G 转换样式转换,将执行样式 E F

     

如果非零,则 P 等于精度,如果未指定精度则等于6,如果精度为1,则等于0。然后,如果样式 E 的转换的指数为X:

     
      
  • 如果 P&gt; X≥-4 ,转换的格式为 f F ,精度 P - 1 - X

  •   
  • 否则,转换的格式为 e E ,精度为 P-1

  •   
     

除非请求替代表示,否则将删除尾随零,如果没有剩余小数部分,也会删除小数点字符。对于无限和非数字转换样式,请参阅注释。

等效的流看起来像这样:

#include <cmath>

float f = ...;
int X; // the exponent
int P = 6; // the desired precision

std::frexp(f, &X); 

std::stringstream ss;
if ((P > X) && (X >= −4))
    ss << std::fixed << std::setprecision(P - 1 − X);
else
    ss << std::scientific << std::setprecision(P - 1); 
ss << f;