9

在 C++ 中输出没有科学记数法或尾随零的浮点数的最优雅方法是什么?

float a = 0.000001f;
float b = 0.1f;

cout << "a: " << a << endl;     //  1e-006 terrible, don't want sci notation.
cout << "b: " << b << endl;     //  0.1 ok.

cout << fixed << setprecision(6);
cout << "a: " << a << endl;     //  0.000001 ok.
cout << "b: " << b << endl;     //  0.100000 terrible, don't want trailing zeros.
4

3 回答 3

6

我不确定“最优雅的方式”,但这是一种方式。

#include <iostream>
#include <iomanip>
#include <sstream>

using namespace std ;
string fix( float x, int p )
{
    ostringstream strout ;
    strout << fixed << setprecision(p) << x ;
    string str = strout.str() ;
    size_t end = str.find_last_not_of( '0' ) + 1 ;
    return str.erase( end ) ;
}


int main()
{
    float a = 0.000001f ;
    float b = 0.1f ;

    cout << "a: " << fix( a, 6 ) << endl;     //  0.000001 ok.
    cout << "b: " << fix( b, 6 ) << endl;     //  0.1 ok.

   return 0;
}

如果您需要大量此类输出,您也许可以创建自己的 I/O 操纵器。这可以说是更优雅,但实现可能是相似的。

于 2013-09-18T21:10:36.603 回答
2

如果字符串操作不会伤害您的眼睛:

std::string fixedfloat(float x)
{
    std::ostringstream ss;
    ss << std::fixed << std::setprecision(std::cout.precision()) << x;
    std::string str = ss.str();
    return str.substr(0, str.find_last_not_of('0') + 1);
}

int main()
{
    float b = 0.1f;

    std::cout << std::setprecision(6) << fixedfloat(b);
}

或者

class fixedfloat
{
public:
    fixedfloat(float x) : x(x) {}
    float value() const { return x; }

private:
    float x;
};

ostream &operator<<(ostream &out, const fixedfloat &f)
{
    ostringstream ss;
    ss << fixed << setprecision(out.precision()) << f.value();
    string str = ss.str();
    out << str.substr(0, str.find_last_not_of('0') + 1);
    return out;
}

int main()
{
    float b = 0.1f;

    cout << setprecision(6) << fixedfloat(b);
}
于 2013-09-18T21:12:07.237 回答
0

像我这样的另一个例子实际上输出“200”。或者做了“200”>>“2”。

这应该适用于所有事情(因为我将它从字符串转换为我使用的 val 函数)。

string fix(float in) {       
    string s = to_string(in);
    size_t dot = s.find_first_of('.'), last = s.find_last_not_of(".0");

    if (dot!=string::npos) return s.substr(0, max(dot,last+1));
    else return s;
}
于 2015-11-02T11:42:21.960 回答