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

C++ 为什么std::setprecision(6)在固定宽度模式下传输超过六位数字?,c++,std,iostream,c++03,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;

以下代码的输出:

#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';
}
#包括
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
内联字符串词法转换(常量浮点参数)
{
细流ss;
ss在固定宽度模式下,“精度”设置用作小数位数,而科学模式将其用作有效位数。IOStreams不提供任何机制将“精度”用作未使用科学模式的有效位数


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

结果。你能对此发表意见吗?它默认为科学记数法,我只是碰巧没有触发指数后缀?(我想我可以自己测试一下)是的,:(好吧,我的结论是IOStreams 2003太有限了,无法满足我的要求。除非你能提出一个聪明的替代方案…(那么你仍然只能得到+1)@我加了一条关于它的注释。这是两者的一个奇怪的混合。不完全是。我想我会坚持这个,直到指数符号成为一个问题,然后绞尽脑汁尝试更好的东西…机器人指数符号只是成为一个问题。