我正在尝试在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::fixed
与std::setprecision(4)
一起提供,但即使不需要,也会在小数点后给出固定的位数:
1.0 gives 1.0000
似乎std::defaultfloat
是我需要的,而不是固定的也不是指数的。但它似乎没有适当地打印小数点后的位数,只有有效数字的选项。
答案 0 :(得分:4)
我们可以使用std::stringstream
和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";
}
当制作成running example时
1.1235
1
1.12
1.1235
123.123
123.1235
123456789
123.001
答案 1 :(得分:1)
使用here的答案以及自定义逻辑删除零和点:
#include <iostream>
#include <iomanip>
#include <sstream>
#include <string>
#include <vector>
#include <iterator>
#include <algorithm>
std::string remove_zeros(std::string numberstring)
{
auto it = numberstring.end() - 1;
while(*it == '0') {
numberstring.erase(it);
it = numberstring.end() - 1;
}
if(*it == '.') numberstring.erase(it);
return numberstring;
}
std::string convert(float number)
{
std::stringstream ss{};
ss << std::setprecision(4) << std::fixed << std::showpoint << number;
std::string numberstring{ss.str()};
return remove_zeros(numberstring);
}
int main()
{
const float values[]{1.12345, 1.0, 1.12, 1.12345789, 147323.123, 123.123456};
for(auto i : values)
std::cout << convert(i) << '\n';
}
产生
1.1235
1
1.12
1.1235
147323.125
123.1235