ios_base ::固定和截断尾随零

时间:2019-01-17 21:44:19

标签: c++ ibm-midrange

当打印某些十进制数字时,可能会四舍五入(我目前的平台是IBM iSeries)。如果我将ios_base :: fixed设置为,则效果会更好,但会打印出令人讨厌的尾随(且无关紧要的)零。有人有更好的方法吗?对于我正在使用的平台,输出为:

myval=100000
myval=99999.990000
myval as string =99999.990000
#include <iostream>
#include <string>
#include <sstream>
#include <iomanip>
#include <unistd.h>
#include <algorithm>

using namespace std;

// returns t
template<typename T> string toString(const T& val)
{
    stringstream os;

    os.setf(std::ios_base::fixed);
    os << val;
    return os.str();
}

class MyApp {
private :
public :
    MyApp();
    virtual ~MyApp();

    void run();

    operator bool() const { return true; }
};


MyApp::MyApp()
{
}

MyApp::~MyApp()
{
}

void MyApp::run()
{
    double myval = 99999.99;
    string myval_as_string = toString<double>(myval);

    cout << "myval=" << myval << endl;

    cout.setf(std::ios_base::fixed);

    cout << "myval=" << myval << endl;
    cout << "myval as string =" << myval_as_string << endl;
}

int main(int argc, char* argv[])
{
    MyApp myApp;

    myApp.run();
}

1 个答案:

答案 0 :(得分:0)

您要查找的是precision,而不是fixedprecision将指定使用的最大精度,但不会自动打印更多的零,因此请根据需要增加它的数量。 fixed会将其强制输出为precision所设置的零。如果您先前已设置fixed,则可以使用ios_base::defaultfloat对其进行重置。

template<typename T> string toString(const T& val)
{
    stringstream os;

    os.precision(15);
    os << val;
    return os.str();
}
....
void MyApp::run()
{
    double myval = 99999.99;
    string myval_as_string = toString<double>(myval);

    cout << "myval=" << myval << endl;
    cout.precision(15);
    cout << "myval=" << myval << endl;
    cout << "myval as string =" << myval_as_string << endl;
}

有关更多信息,您可以在此处查看标准:http://www.cplusplus.com/reference/ios/ios_base/precision/。请注意以下行:

  

使用默认浮点表示法,精度字段   指定总共显示的最大有效位数   计算小数点之前和之后的小数。注意   这不是最小值,因此不会填充显示的内容   如果可以用更少的数字显示数字,则尾随零   比精度高的数字。