正确做法是同时使用 std::fixed 和 std::setprecision(2) 控制输出格式,并确保除法运算至少有一个操作数为浮点类型(如将 sum 声明为 double),避免整数除法截断。

用 std::fixed 和 std::setprecision 控制输出精度
直接对平均值做四舍五入或截断容易出错,C++标准做法是控制输出流格式。关键不是“算出两位小数”,而是“显示两位小数”。std::fixed 确保用定点表示法(而非科学计数法),std::setprecision(2) 在 fixed 模式下才真正控制小数位数。
常见错误:只写 std::setprecision(2) 不加 std::fixed,结果可能是 1.2e+01 或只保留总共 2 位有效数字(比如 123.45 变成 1.2e+02)。
- 必须同时使用
std::fixed和std::setprecision(2) - 这两个操作作用于
std::cout(或任意std::ostream),不影响变量本身的值 - 如果后续还要输出其他精度的数,记得重置格式(例如用
std::defaultfloat)
数组求和时注意类型提升,避免整数除法
如果数组是 int 类型,直接用 sum / n 会触发整数除法,结果被截断为整数,再格式化也无济于事。
正确做法是让除法至少有一个操作数是浮点类型:
- 把
sum声明为double或float(推荐double) - 或者强制转换:
static_cast<double>(sum) / n</double> - 不要写
sum / (double)n—— 虽然可行,但n是size_t时可能隐式转成大整数再转 double,不如直接 cast 分子更清晰
示例片段:
int arr[] = {1, 2, 3, 4, 5};
int n = 5;
double sum = 0.0;
for (int i = 0; i <h3>处理空数组边界情况</h3><p>如果数组长度为 0,<code>sum / n</code> 会除零,程序崩溃或产生 <code>inf</code>/<code>nan</code>。实际代码中必须检查:</p>
- 在计算前判断
n == 0,并决定返回什么(如抛异常、返回 0.0、或提前 return) - 用
std::vector时可写if (vec.empty());用 C 风格数组需传入明确长度 - 别依赖“用户不会传空数组”——调试时很难复现,上线后可能突然崩
需要真正四舍五入到两位小数再存储?用 std::round
如果需求不是“显示”,而是“把平均值四舍五入后存成两位小数的数值”(比如用于后续比较或计算),就不能只靠输出格式:
- 先算出原始平均值
avg - 再执行
double rounded = std::round(avg * 100.0) / 100.0; - 此时
rounded的值就是数学上最接近的两位小数(如 3.145 → 3.15) - 注意:浮点数无法精确表示所有十进制小数,
3.15在内存中仍是近似值,仅适用于一般精度要求场景
这种 round 方式不改变输出格式设置,但改变了数值本身。是否需要它,取决于你的下游逻辑是否依赖“这个值已经是两位小数”。
真正容易忽略的是:输出精度控制和数值精度控制是两回事;空数组没检查,程序在某个边缘输入下就挂;还有很多人以为 setprecision(2) 单独就能搞定小数位,结果调试半天发现是少了 fixed。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











