C++ 中实现四舍五入的简易方法

  以前没怎么注意过 C++ 的输入输出以及四舍五入这种细枝末节的问题,但是做些竞赛题发现这些边角料用到的地方还很多.
  这里记下 C++ 中实现四舍五入的库函数,自己实现小数点后任意位的四舍五入,以及通过控制输出来进行四舍五入.

相关库函数

  1. double round(double x) 四舍五入到相邻整数
  2. double floor(double x) 向下取整
  3. double ceil(double x) 向上取整
  4. double trunc(double x) 向 0 取整

  详细介绍见 CPP reference.

保留小数点后任意位数并四舍五入的实现

1
2
3
4
5
6
double round(double num, int fig)
{
int shift = static_cast<int>(std::pow(10, fig));
double half = num >= 0 ? 0.5f : -0.5f;
return int(num * shift + half) / double (shift);
}

iomanip 控制输出

  C++ iomanip 头文件中包含对输入输出进行控制的相关工具.
  以下操作符的作用均是持续的.

  如果只是在输出时要求保留几位有效数字,使用 std::setpecision 是最方便的.
  此操作符控制浮点数输出时显示的数字个数,会进行四舍五入.
  该操作符影响之后的所有输出,直到再次使用 std::setpecision 为止.

  当末尾最后几位为 0 时,0 是无法输出的.需要使用 std::showpoint
  如果是要保留小数点后多少位有效数字,可使用 ios::fixed 将小数点固定,该操作符更改浮点数的输入/输出的默认格式.
  使用std::fixed 将小数点固定后,对此输出流对象 setpecision 的含义变为小数点后保留多少为有效数字,最后一次设置有效.

  通常这些操作符的使用方法是作为流运算符的右参数,此时使用 std 命名空间中的函数
  等效的简单方法是使用流对象的 setf 方法设置,此时操作符使用 ios 中的 flag.

1
2
3
4
5
6
7
8
9
10
/** 输出 PI, 保留五位有效数字,四舍五入*/
std::cout << std::setpecision(5) << M_PI;
/** 输出: 3.1416*/
std::cout << std::setpecision(6) << M_PI;
/** 输出: 3.14159*/
std::cout << std::setpecision(6) << std::showpoint << 1.001000;
/** 输出: 1.001000*/
std::cout.setf(ios::showpoint);
/** 固定小数点, 后面位数设置为 setpecision(6)*/
std::cout.setf(ios::fixed);