C ++如何避免尾随零?

时间:2014-03-12 19:00:48

标签: c++ precision digit

如果你这样做

double number;
cout.precision(3)
cout<<number;

对于像1.23456这样的数字你得到1.234但是如果数字是1.2则得到1.200。如何同时获得1.234和1.2(它们是无用的零)?假设您不知道要打印的号码。

3 个答案:

答案 0 :(得分:4)

#include <iostream>
#include <iomanip>
using namespace std;

auto main() -> int
{
    cout << setprecision( 4 );
    cout << 1.23456 << endl;        // -> "1.235"
    cout << 1.2 << endl;            // -> "1.2"
}

就是这么简单:这是你默认得到的。


在设置fixedscientific后,C ++ 03缺少用于重置为默认格式的操纵器。但是,在C ++ 11中引入了 defaultfloat 操纵器。您可以像这样使用它:

#include <iostream>     // defaultfloat
#include <iomanip>      // setprecision
using namespace std;

#ifdef __GNUC__ // Also check for version number, e.g. 4.8.2 and earlier
    namespace std {
        inline
        auto defaultfloat( ios_base& stream )
            -> ios_base&
        { stream.unsetf( ios_base::floatfield ); return stream; }
    }
#endif

auto main() -> int
{
    cout << "Lots of digits: " << fixed << setprecision( 16 ) << 1.2 << endl;
    cout << endl;

    cout << "Deault presentation:" << endl;
    cout << defaultfloat;
    cout << 1.234 << endl;
    cout << 1.2 << endl;
}

答案 1 :(得分:0)

您可以编写一个操纵器来实现格式化:

#include <cmath>
#include <iostream>

template <typename T>
struct DecimalPrecision
{
    const T& value;
    const unsigned decimals;

    DecimalPrecision(const T& value, unsigned decimals)
    : value(value), decimals(decimals)
    {}

    void write(std::ostream& stream) const {
        std::ios_base::fmtflags flags = stream.flags();
        stream.unsetf(std::ios_base::floatfield);
        std::streamsize restore
            = stream.precision(std::ceil(std::log10(std::abs(value))) + decimals);
        stream << value;
        stream.precision(restore);
        stream.flags(flags);
    }
};

template <typename T>
inline DecimalPrecision<T> decimal_precision(const T& value, unsigned decimals) {
    return DecimalPrecision<T>(value, decimals);
}

template <typename T>
inline std::ostream& operator << (std::ostream& stream, const DecimalPrecision<T>& value) {
    value.write(stream);
    return stream;
}


#include <iomanip>

int main()
{
    std::cout << std::setprecision(2);
    double values[] = { 12345.6789, 1.23456789, 1.2 };
    for(unsigned i = 0; i < sizeof(values)/sizeof(values[0]); ++i)
        std::cout
            << i << ": "  << values[i] << '\n'
                 << "   " << decimal_precision(values[i], 2) << '\n';
}

答案 2 :(得分:0)

您甚至尝试过自己的示例吗? 尾随零号不打印(默认情况下)。

实际上,一个人通常想要(!)那些零(它们传达信息,并且它们避免破坏输出)。 这是通过cout << std :: fixed实现的。

除非您使用过std :: fixed,否则即使精度高于2,1.2也会产生1.2,而不是1.200。

顺便说一句:精度表示所有数字,而不仅仅是点之后的数字,因此precision = 3导致1.23-除非您输入std :: fixed,否则仅对点之后的那些数字进行计数。