如何避免科学记数法而是显示全数?

时间:2016-02-02 22:27:54

标签: c++ scientific-notation

我在其中一个库中有一个以下代码,导致某些数字以科学记数法的形式显示。

T value = 0;

template<typename U> void process(U& buf, DataOption holder) const {
    if (holder == DataOption::TYPES) {
        switch (type_) {
        case teck::PROC_INT:
            buf << "{\"int\":" << value << "}";
            break;
        case teck::PROC_LONG:
            buf << "{\"long\":" << value << "}";
            break;
        case teck::PROC_FLOAT:
            buf << "{\"float\":" << value << "}";
            break;
        case teck::PROC_DOUBLE:
            buf << "{\"double\":" << value << "}";
            break;
        default:
            buf << "{\"" << type_ << "\":" << value << "}";
        }
    }
}

对于上述一些不同的案例,“价值”正在以科学记数法出现。我怎样才能避免显示科学记数而是显示完整数字?我做了一些研究,我可以使用“std :: fixed”但我应该在哪里使用它?

2 个答案:

答案 0 :(得分:1)

std::fixed在同一个流中运行,因此如果您正在使用无状态流,这将无法正常工作

case teck::PROC_DOUBLE:
    buf << std::fixed;
    buf << "{\"double\":" << value << "}";

相反它应该是这样的

case teck::PROC_DOUBLE:
    buf << "{\"double\":" << std::fixed << value << "}";

因此,您的功能可以像一样简化,以提高可读性

template<typename U> void process(U& buf, DataOption holder) const
{
    if (holder == DataOption::TYPES)
    {
        buf << "{\"";

        switch (type_)
        {
            case teck::PROC_INT:    buf << "int";    break;
            case teck::PROC_LONG:   buf << "long";   break;
            case teck::PROC_FLOAT:  buf << "float";  break;
            case teck::PROC_DOUBLE: buf << "double"; break;
            default:                buf <<  type_;
        }

        buf << "\":" << std::fixed << value << "}";
    }
}

答案 1 :(得分:0)

它是一个流装饰器:

buf << std::fixed << double_value;

查看更多:std::fixed