C++;如何输出小数点后至少有一个数字的数字 如何使我的程序输出一个数字,至少在十进制标记C++后面有一个数字? 输出: 1=1.0或1.25=1.25或2.2=2.2或3.456789=3.456789

C++;如何输出小数点后至少有一个数字的数字 如何使我的程序输出一个数字,至少在十进制标记C++后面有一个数字? 输出: 1=1.0或1.25=1.25或2.2=2.2或3.456789=3.456789,c++,numbers,decimal,C++,Numbers,Decimal,提前感谢如果您要经常调用此函数,那么这可能不是您想要的,因为这不是最好的方法,但它确实有效 大致如下: 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 po

提前感谢

如果您要经常调用此函数,那么这可能不是您想要的,因为这不是最好的方法,但它确实有效

大致如下:

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";
}
string text=to_string(55);
if(text.find(“.”)=std::string::npos){

cout使用
showpoint
强制打印小数点

double x = 1.0;
std::cout << std::showpoint << x << "\n";
double x=1.0;
std::cout
#包括
#包括
#包括
结构格式化浮点
{
static constexpr const double precision=std::sqrt(std::numeric_limits::epsilon());
常数双值;
FormatFloat(双值):值(值){}
空写(std::ostream&stream)常量{
标准::streamsize n=0;
双f=标准::abs(值-(长)值);
while(精度双值=。。。;
std::ostringstream ss;
ss.精度(标准:数值限制:数字10+2);

ss std::showpoint不保证在该点之后输出任何零,只保证该点将被输出。如果流的精度设置为1,则可能以“1”结尾。@mxsscott:同意。您需要确保流的精度正确(或您想要的精度)还有。由于格式化的方式,这个问题没有完美的解决方案。很好:我个人会改变两件事。1)去掉
format\u float()
函数。stream操作符通过const值传递给它,这样你可以在使用它们时声明它们。2)删除
write()
方法。只需将
运算符也放入
inline
是无用的关键字。只有在必须时才使用它。唯一需要的时间是让链接器知道它们是一个函数的多个版本,因为您已在头文件中定义了该函数,并且大多数现代编译器现在都支持不需要的完整程序优化必要的。@LokiAstari格式\u float用于维护(可能FormatFloat会成为模板)。当然。然后让我们遵循约定。当您编写简单的模板演绎函数时,约定是将其称为
make_X
,其中X是类型的名称。
make_pair
make_unique
make_shared
等。此外,对于这一点的要求随着C++14的出现,我相信模板参数演绎n被扩展到类的构造函数参数。@LokiAstari这对于流操纵器来说太过分了!
#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;
}
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");
}