# C++ 中,处理数学运算和数值格式化 常用数学函数
*C++ 技术栏*
在 C++ 中,处理数学运算和数值格式化(如上下取整、保留或截断小数位)需要用到 `<cmath>` 和 `<iomanip>` 等标准库。
以下是常用的数学函数和操作方法的总结:
## 目录
[TOC]
---
### 一、常用数学函数(需包含头文件 cmath)
```cpp
#include <cmath>
```
| 函数 | 说明 | 示例 |
|------|------|------|
| `std::floor(x)` | 向下取整(不大于 x 的最大整数) | `floor(3.7) = 3.0`, `floor(-3.2) = -4.0` |
| `std::ceil(x)` | 向上取整(不小于 x 的最小整数) | `ceil(3.2) = 4.0`, `ceil(-3.7) = -3.0` |
| `std::round(x)` | 四舍五入到最接近的整数 | `round(3.5) = 4.0`, `round(2.4) = 2.0` |
| `std::trunc(x)` | 截断小数部分(向零取整) | `trunc(3.9) = 3.0`, `trunc(-3.9) = -3.0` |
| `std::fabs(x)` | 返回绝对值(浮点数) | `fabs(-4.5) = 4.5` |
---
### 二、保留小数点后 n 位(输出格式化)
保留小数通常用于**输出显示**,使用 `<iomanip>` 中的流操作符。
```cpp
#include <iostream>
#include <iomanip>
double value = 3.1415926;
// 保留 2 位小数输出
std::cout << std::fixed << std::setprecision(2) << value << std::endl;
// 输出: 3.14
```
- `std::fixed`:使用固定小数点格式。
- `std::setprecision(n)`:设置小数点后保留 n 位。
> ⚠️ 注意:这只是**输出格式化**,不会改变变量本身的值。
---
### 三、实际保留/截断数值(改变值)
如果需要**真正改变数值**,保留 n 位小数,可以通过数学运算实现。
#### 1. 四舍五入保留 n 位小数
```cpp
double round_to_n_digits(double value, int n) {
double factor = std::pow(10.0, n);
return std::round(value * factor) / factor;
}
```
**示例:**
```cpp
double x = 3.14159;
double result = round_to_n_digits(x, 3); // 3.142
```
#### 2. 向下保留 n 位小数(截断)
```cpp
double trunc_to_n_digits(double value, int n) {
double factor = std::pow(10.0, n);
return std::trunc(value * factor) / factor;
}
```
**示例:**
```cpp
double x = 3.14159;
double result = trunc_to_n_digits(x, 3); // 3.141
```
#### 3. 向上保留 n 位小数
```cpp
double ceil_to_n_digits(double value, int n) {
double factor = std::pow(10.0, n);
return std::ceil(value * factor) / factor;
}
```
---
### 四、注意事项
1. **浮点精度问题**:
- 浮点数在计算机中是近似存储的,如 `0.1` 无法精确表示。
- 避免直接比较浮点数是否相等,建议使用 `epsilon` 判断。
2. **性能考虑**:
- `std::pow(10.0, n)` 在 n 较小时可手动展开(如 `n=2` 时用 `100.0`),提高效率。
3. **头文件**:
- 数学函数:`#include <cmath>`
- 输出格式化:`#include <iomanip>`
- 常量如 `M_PI` 可能需要定义 `_USE_MATH_DEFINES` 并包含 `<cmath>`
---
### 五、C++20 新增(推荐)
C++20 引入了 `<numbers>` 头文件和更安全的数学常量:
```cpp
#include <numbers>
double pi = std::numbers::pi; // 更标准的 π
```
---
### 总结
| 需求 | 方法 |
|------|------|
| 向下取整 | `std::floor(x)` |
| 向上取整 | `std::ceil(x)` |
| 四舍五入 | `std::round(x)` |
| 截断小数 | `std::trunc(x)` |
| 输出保留 n 位 | `std::fixed << std::setprecision(n)` |
| 数值保留 n 位 | 乘 `10^n` → 取整 → 除 `10^n` |
------
***操作记录***
作者:[zhao](https://www.lingyuzhao.top//index.html?search=4 "zhao")
操作时间:2025-10-06 13:52:11 星期一 【时区:UTC 8】
事件描述备注:保存/发布
中国 天津市 天津
[](如果不需要此记录可以手动删除,每次保存都会自动的追加记录)