如何让我的程序输出一个数字,在小数点 C++ 后面至少有一个数字?输出:1 = 1.0 或 1.25 = 1.25 或 2.2 = 2.2 或 3.456789 = 3.456789
提前致谢
用于showpoint
强制打印小数点
double x = 1.0;
std::cout << std::showpoint << x << "\n";
后面是0
满足流精度所需的数量。
#include <cmath>
#include <iostream>
#include <limits>
struct FormatFloat
{
static constexpr const double precision = std::sqrt(std::numeric_limits<double>::epsilon());
const double value;
FormatFloat(double value) : value(value) {}
void write(std::ostream& stream) const {
std::streamsize n = 0;
double f = std::abs(value - (long long)value);
while(precision < f) {
f *= 10;
f -= (long long)f;
++n;
}
if( ! n) n = 1;
n = stream.precision(n);
std::ios_base::fmtflags flags = stream.setf(
std::ios_base::fixed,
std::ios_base::floatfield);
stream << value;
stream.flags(flags);
stream.precision(n);
}
};
inline std::ostream& operator << (std::ostream& stream, const FormatFloat& value) {
value.write(stream);
return stream;
}
inline FormatFloat format_float(double value) {
return FormatFloat(value);
}
int main()
{
std::cout
<< format_float(1) << '\n'
<< format_float(1.25) << '\n'
<< format_float(2.2) << '\n'
<< format_float(3.456789) << std::endl;
return 0;
}
如果你要经常调用这个函数,那么这可能不是你要找的,因为这不是最好的方法,但它确实有效。
类似于以下内容:
string text = to_string(55);
if (text.find(".") != std::string::npos) {
cout << "No digit added after decimal point" << text;
}
else
{
cout << "Digit added after decimal point" << text << ".0";
}
double value = ...;
std::ostringstream ss;
ss.precision(std::numeric_limits<double>::digits10 + 2);
ss << value;
std::string s = ss.str();
if (s.find('.') == string::npos)
{
s.append(".0");
}
或者
double value = ...;
std::wostringstream ss;
ss.precision(std::numeric_limits<double>::digits10 + 2);
ss << value;
std::wstring s = ss.str();
if (s.find(L'.') == string::npos)
{
s.append(L".0");
}