在 C++ 中设置浮点数的精度

Jinku Hu 2023年10月12日
  1. 使用 std::setprecision 设置 C++ 中浮点数的精度
  2. 使用 std::floorstd::ceil 修改浮点数的精度
  3. 使用 std::roundstd::lround 修改浮点数的精度
在 C++ 中设置浮点数的精度

本文将说明几种如何在 C++ 中设置浮点数精度的方法。

使用 std::setprecision 设置 C++ 中浮点数的精度

std::setprecision 是 STL I/O 操作器库的一部分,可用于格式化输入/输出流。setprecision 更改浮点数的精度,并且仅采用一个整数参数来指定要在小数点后显示的数字位数。即,对于浮点数隐式假定的默认精度是逗号后的六位数。但是,当数量太少并且没有使用机械手时,有时可能会用科学记数法来显示浮点数。请注意,这样的数字可能会丢失所有有效数字并显示为零,如以下示例代码所示。

#include <iomanip>
#include <iostream>
#include <vector>

using std::cout;
using std::endl;
using std::fixed;
using std::setprecision;
using std::vector;

int main() {
  vector<double> d_vec = {123.231,       2.2343, 0.012,
                          26.9491092019, 113,    0.000000234};

  for (auto &i : d_vec) {
    cout << i << " | ";
  }
  cout << endl;

  for (auto &i : d_vec) {
    cout << setprecision(3) << i << " | ";
  }
  cout << endl;

  return EXIT_SUCCESS;
}

输出:

123.231 | 2.2343 | 0.012 | 26.9491 | 113 | 2.34e-07 |
123.231 | 2.234 | 0.012 | 26.949 | 113.000 | 0.000 |

使用 std::floorstd::ceil 修改浮点数的精度

std::floorstd::ceil 函数由 <cmath> 头文件提供,该头文件最初是在 C 标准库中实现的。ceil 函数计算大于或等于作为唯一参数传递的浮点数的最小整数值。另一方面,floor 会计算小于或等于参数的最大整数值。这些函数是针对 floatdoublelong double 类型定义的。

#include <cmath>
#include <iomanip>
#include <iostream>
#include <vector>

using std::cout;
using std::endl;
using std::fixed;
using std::vector;

int main() {
  vector<double> d_vec = {123.231,       2.2343, 0.012,
                          26.9491092019, 113,    0.000000234};

  for (auto &i : d_vec) {
    cout << i << " | ";
  }
  cout << endl;

  for (auto &i : d_vec) {
    cout << fixed << std::ceil(i) << " | ";
  }
  cout << endl;

  for (auto &i : d_vec) {
    cout << fixed << std::floor(i) << " | ";
  }
  cout << endl;

  return EXIT_SUCCESS;
}

输出:

123.231 | 2.2343 | 0.012 | 26.9491 | 113 | 2.34e-07 |
124.000000 | 3.000000 | 1.000000 | 27.000000 | 113.000000 | 1.000000 |
123.000000 | 2.000000 | 0.000000 | 26.000000 | 113.000000 | 0.000000 |

使用 std::roundstd::lround 修改浮点数的精度

另外,std::roundstd::round 可以用来计算最接近零的整数值。这些函数可能会引发与浮点算术相关的错误,这些错误会在页面上进行详细讨论。

#include <cmath>
#include <iomanip>
#include <iostream>
#include <vector>

using std::cout;
using std::endl;
using std::fixed;
using std::vector;

int main() {
  vector<double> d_vec = {123.231,       2.2343, 0.012,
                          26.9491092019, 113,    0.000000234};

  for (auto &i : d_vec) {
    cout << i << " | ";
  }
  cout << endl;

  for (auto &i : d_vec) {
    cout << fixed << std::round(i) << " | ";
  }
  cout << endl;

  for (auto &i : d_vec) {
    cout << fixed << std::lround(i) << " | ";
  }
  cout << endl;

  return EXIT_SUCCESS;
}

输出:

123.231 | 2.2343 | 0.012 | 26.9491 | 113 | 2.34e-07 |
123.000000 | 2.000000 | 0.000000 | 27.000000 | 113.000000 | 0.000000 |
123 | 2 | 0 | 27 | 113 | 0 |
作者: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

DelftStack.com 创始人。Jinku 在机器人和汽车行业工作了8多年。他在自动测试、远程测试及从耐久性测试中创建报告时磨练了自己的编程技能。他拥有电气/电子工程背景,但他也扩展了自己的兴趣到嵌入式电子、嵌入式编程以及前端和后端编程。

LinkedIn Facebook

相关文章 - C++ Float