3

请考虑如下所示的代码片段:

// 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 打印?

4

3 回答 3

5

乘以 100 并以精度 0 打印。

int main () {
  double f =3.14159;
  std::cout.precision(0);

  std::cout << std::fixed << f*100 << '\n';
  return 0;
}
于 2013-07-23T07:28:44.037 回答
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 错误而打印出预期之外的内容。

于 2013-07-23T07:47:52.340 回答
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;
}
于 2013-07-23T07:47:15.277 回答