请考虑以下代码段:
// setprecision example
#include <iostream> // std::cout, std::fixed
#include <iomanip> // std::setprecision
int main () {
double f =3.14159;
std::cout.precision(2);
std::cout << f*100 << '\n';
return 0;
}
我想要做的是在屏幕314上打印(即打印f没有小数,精度为2)
我想首先将精度设置为2,然后乘以100。
但似乎精确度最终应用于f * 100。谁能建议任何方法在f上应用精度然后将数字乘以100,最后以精度0打印?
答案 0 :(得分:5)
乘以100并以精度0打印。
int main () {
double f =3.14159;
std::cout.precision(0);
std::cout << std::fixed << f*100 << '\n';
return 0;
}
答案 1 :(得分:1)
实际上有一种“正确”的方法,而不必改变价值。您可以使用自己的std::ostringstream
子类准备std::numpunct
来为您执行此操作:
#include <locale>
class no_decimal_punct: public std::numpunct<char> {
protected:
virtual char do_decimal_point() const
{ return '\0'; }
};
您现在可以准备一个std::ostringstream
,它将使用上述no_decimal_punct
类:
#include <sstream>
#include <iostream>
std::ostringstream strm;
strm.imbue(std::locale(strm.getloc(), new no_decimal_punct));
strm.precision(2);
std::fixed(strm);
double f = 3.14159;
strm << f;
std::cout << strm.str() << '\n';
这里的优点是你没有改变f
的值,由于FP错误,它可能会打印除预期之外的东西。
答案 2 :(得分:0)
有很多方法可以显示314:
#include <iostream>
using namespace std;
int main() {
const double PI = 3.1415926;
cout.precision(3);
cout<<PI * 100<<endl;
}
#include <iostream>
using namespace std;
int main() {
const double PI = 3.1415926;
cout<<(int)(PI * 100)<<endl;
}