在我的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
会自动选择更好的输出值的方法吗?或者我只是犯了一个棘手的错误?
答案 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;