【问题标题】:How to avoid scientific notation and show full number instead?如何避免科学记数法并显示完整数字?
【发布时间】:2016-02-02 22:27:54
【问题描述】:

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

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”,但我应该在哪里使用它?

【问题讨论】:

  • 您只需要在某个时候执行buf &lt;&lt; std::fixed,这将意味着从那时起buf 的固定精度输出,直到您将其更改为其他内容。除了std::setw,流操作符是“粘性的”。假设buf 是一个流。

标签: c++ scientific-notation


【解决方案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 << "}";
    }
}

【讨论】:

  • 如果buf 是一个流,那么这两个样本是相同的。 (但可能buf 可能是其他重载operator&lt;&lt; 以返回临时字符串流的类,在这种情况下,第二个版本更好)
【解决方案2】:

这是一个流装饰器:

buf << std::fixed << double_value;

查看更多:std::fixed

【讨论】:

    猜你喜欢
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多