gpt4 book ai didi

c++ - 最多打印 4 位小数

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:28:14 25 4
gpt4 key购买 nike

我试图在 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

我尝试了 std::setprecision(4) 但它设置了有效数字的数量并且在测试用例中失败了:

123.123456 gives 123.1

我还尝试将 std::fixedstd::setprecision(4) 一起给出,但即使不需要,它也会给出小数点后的固定位数:

1.0 gives 1.0000

似乎 std::defaultfloat 是我需要的,既不是固定的也不是指数的。但它似乎没有适本地打印小数点后的位数,并且只有有效数字的选项。

最佳答案

我们可以使用 std::stringstreamstd::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";
}

当做成 running example 时会给出

1.1235
1
1.12
1.1235
123.123
123.1235
123456789
123.001

关于c++ - 最多打印 4 位小数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41229910/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com