为什么std :: setprecision(6)在固定宽度模式下流式传输超过六位数?

时间:2014-03-03 15:15:50

标签: c++ std iostream c++03

以下代码的输出:

#include <limits>
#include <iostream>
#include <iomanip>
#include <limits>
#include <string>
#include <sstream>

using namespace std;

inline string lexical_cast(const float arg)
{
    stringstream ss;
    ss << fixed << setprecision(numeric_limits<float>::digits10) << arg;
    if (!ss)
        throw "Conversion failed";

    return ss.str();
}

int main()
{
    cout << numeric_limits<float>::digits10 << '\n';
    cout << lexical_cast(32.123456789) << '\n';
}

是:

  

6
  32.123455

我期待,并希望:

  

6
  32.1234

因为据我所知,这是float可以在我的系统上可靠地给我的程度。

我如何说服IOStreams按照我的意愿行事?

1 个答案:

答案 0 :(得分:12)

在固定宽度模式下,“精确”设置用作小数位数,而科学模式则用作有效位数。 IOStreams没有提供使用“precision”作为有效数字的机制而不使用科学模式。

还有第三种模式,在C ++ 11中使用std::defaultfloat激活。如果您未设置固定模式或科学模式,则可以使用此“默认”模式。您可以通过使用s.unsetf(std::ios_base::floatfield)重置浮动标志,在C ++ 03中重新激活它。这种模式在科学和某种“固定而没有尾随零”之间有点混合。