除非数字是整个c ++,否则舍入到小数点后第二位

时间:2017-10-15 08:46:20

标签: c++ floating-point output rounding precision

我正在尝试将Cpp中的平均值打印到float num的2个小数点。 avgfloatsumfloatcountint

目前,如果我有10/1,例如它输出10.00。我希望输出只有10.如果avg获得值3.1467665,例如,它应显示为3.14

avg = sum/count;
std::cout << std::fixed << std::setprecision(2) << avg;

舍入应仅适用于输出。无需更改avg,但如果更容易,则可以更改其值。

在c ++ 11之前寻找使用标准的解决方案。

UPD :当我希望它为27.5时,输出为27.50。

1 个答案:

答案 0 :(得分:3)

您可以根据avg值的浮动模数选择精度。以下作品:

int main() {
  double sum = 10;
  double count = 3;
  double avg = sum/count;
  double mod;
  std::cout << std::fixed
            << std::setprecision((modf(avg, &mod) != 0.0) ? 2 : 0)
            << avg
            << std::endl;
}

考虑增加的规格:

  • 写2.5而不是2.50
  • 为3.1421783921写3.14,而不是3.15

以下是使用@IInspectable的建议方法的可能实现:

  std::stringstream ss;
  ss << std::fixed << avg;

  size_t pos = ss.str().find('.');
  if (pos + 2 < ss.str().size()) // If there is a '.' and more than 2 digits after it
    pos += 3;
  std::string s = ss.str().substr(0, pos); // Leave only two digits

  s.erase(std::find_if(s.rbegin(), s.rend(), [](int ch) { return ch != '0'; }).base(), s.end()); // Remove trailing zeros
  s.erase(std::find_if(s.rbegin(), s.rend(), [](int ch) { return ch != '.'; }).base(), s.end()); // Remove trailing '.' when needed
  std::cout << s << std::endl;

这将输出:

  • 10/4 -> 2.5
  • 10/3 -> 3.33
  • 10/2 -> 5
  • 10/7 -> 1.42
  • 3.9999 -> 3.99