当打印某些十进制数字时,可能会四舍五入(我目前的平台是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();
}
答案 0 :(得分:0)
您要查找的是precision
,而不是fixed
。 precision
将指定使用的最大精度,但不会自动打印更多的零,因此请根据需要增加它的数量。 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/。请注意以下行:
使用默认浮点表示法,精度字段 指定总共显示的最大有效位数 计算小数点之前和之后的小数。注意 这不是最小值,因此不会填充显示的内容 如果可以用更少的数字显示数字,则尾随零 比精度高的数字。