打印最多4位小数

Abd*_*iJK 5 c++ printing cout

我试图在C++(使用流)中的小数点后打印最多4位数.因此,如果数字在小数点后不需要4位数,我希望它只使用它实际需要的小数位数.

例子:

1.12345    -> 1.1234
1.0        -> 1
1.12       -> 1.12
1.12345789 -> 1.1234
123.123    -> 123.123
123.123456 -> 123.1234
Run Code Online (Sandbox Code Playgroud)

我试过std::setprecision(4)但是设置了有效位数并且在测试用例中失败了:

123.123456 gives 123.1
Run Code Online (Sandbox Code Playgroud)

我也尝试过std::fixed,std::setprecision(4)但即使不需要,也会在十进制后给出一个固定的位数:

1.0 gives 1.0000
Run Code Online (Sandbox Code Playgroud)

这似乎std::defaultfloat是我需要的,而不是固定的也不是指数的.但它似乎没有适当地打印小数点后的位数,只有有效数字的选项.

Nat*_*ica 4

我们可以使用 astd::stringstream和 a来做到这一点std::string。我们将 传递double给流,对其进行格式化,就像我们将其发送到 一样cout。然后我们检查从流中获取的字符串,看看是否有尾随零。如果有的话,我们就把它们除掉。一旦我们这样做了,我们就会检查是否只剩下一个小数点,如果是的话,我们也会去掉它。你可以使用这样的东西:

int main()
{
    double values[] = { 1.12345, 1.0, 1.12, 1.12345789, 123.123, 123.123456, 123456789, 123.001 };
    std::vector<std::string> converted;
    for (auto e : values)
    {
        std::stringstream ss;
        ss << std::fixed << std::setprecision(4) << e;
        std::string value(ss.str());
        if (value.find(".") != std::string::npos)
        {
            // erase trailing zeros
            while (value.back() == '0')
                value.erase(value.end() - 1);
            // if we are left with a . at the end then get rid of it
            if (value.back() == '.')
                value.erase(value.end() - 1);
            converted.push_back(value);
        }
        else
            converted.push_back(value);
    }
    for (const auto& e : converted)
        std::cout << e << "\n";
}
Run Code Online (Sandbox Code Playgroud)

当制作成一个运行示例时给出

1.1235
1
1.12
1.1235
123.123
123.1235
123456789
123.001
Run Code Online (Sandbox Code Playgroud)