数据在stringstream中被破坏

时间:2014-01-23 09:02:27

标签: c++ stringstream

这可能是微不足道的,但我无法理解为什么会这样。

我正在尝试将“double”类型的数据附加到stringstream中,但它似乎已损坏。对此有何见解?

for (int metalNum = 0; metalNum< r_maxMetalNum; metalNum++)
{
    if ((unsigned int)metalNum >= metalLayerV.size())  return false;

    if (metalLayerV[metalNum].getThick() >= 0)
    {
        if (metalNum != 0)  metalThickSS << ",";
        cout << "JJJJ..."  << metalLayerV[metalNum].getThick() << "\n";
        metalThickSS << std::setprecision(3) << metalLayerV[metalNum].getThick();
    }
}

cout << "Hello " << metalThickSS.str() << "\n";

输出是:

JJJJ...0.000000
JJJJ...0.000000
JJJJ...0.000000
JJJJ...0.000000
JJJJ...0.000000
JJJJ...0.000000
JJJJ...0.000000
JJJJ...0.000000
JJJJ...0.000000
JJJJ...0.000000
Hello 4.45e-321,4.45e-321,4.45e-321,4.45e-321,4.45e-321,4.45e-321,4.45e-321,4.45e-321,6.18e-320,6.18e-320

感谢大家的评论。我发现这实际上是一个微不足道的问题。我只需要使用带有输出字符串流的fixed和showpoint。

2 个答案:

答案 0 :(得分:0)

您没有显示太多重要代码,所以我只能这样做 猜测,但先验,看起来你已经设定标准 固定格式,因此它只会在小数点后显示六位数 (并且任何小于0.0000005的值都将显示为 0.000000),但您的ostringstream仍设置为 默认(或科学格式)。并假设IEEE浮动 点,您显示的值显示逐渐下溢, 这意味着它们非常非常接近0.0,但不是 0.0(并且可能涉及到一些粗心大意 它们的计算方式)。

答案 1 :(得分:0)

它可能是由代码中其他位置的cout << fixed引起的。 请参阅以下代码:

  double d = DBL_MIN / 10000000000000 * 2;
  cout << d << endl;
  cout << fixed;
  cout << d << endl;

  stringstream ss;
  ss << setprecision(3);
  ss << d;
  cout << ss.str() << endl;

打印

4.44659e-321
0.000000
4.45e-321

这可能是您输出的唯一解释。