C++计算数组正负零元素占比时的舍入错误排查求助
C++计算数组正负零占比时测试用例不通过的修复方案
你的代码存在两个核心问题,直接导致测试用例失败:
- 计数变量未初始化:
pos、neg、zero这些float变量声明后未赋值为0,初始值是内存中的随机垃圾值,累加后统计结果完全错误。 - 精度不足:float类型仅能提供6-7位有效数字,当数组规模较大时,除法运算的精度损失会超出题目允许的误差范围。
修复步骤
- 初始化计数变量为0,确保从正确起点开始统计
- 改用
double类型进行计算,它拥有15-17位有效数字,完全满足题目精度要求 - (可选优化)将循环中的独立
if改为else if,因为一个数只能属于正、负、零中的一类,减少不必要的判断 - 确保代码包含
<iomanip>头文件,setprecision和fixed依赖该头文件支持
修正后的代码
#include <iomanip> // 必须包含此头文件才能使用setprecision和fixed void plusMinus(vector<int> arr) { // 初始化计数变量为0,用double保证精度 double pos = 0.0, neg = 0.0, zero = 0.0; // 将数组大小转为double,避免整数除法问题 double arrsize = static_cast<double>(arr.size()); // 范围for循环更简洁易读 for(int num : arr) { if(num > 0) pos++; else if(num < 0) neg++; else zero++; } double posRatio = pos / arrsize; double negRatio = neg / arrsize; double zeroRatio = zero / arrsize; cout << fixed << setprecision(6) << posRatio << endl; cout << fixed << setprecision(6) << negRatio << endl; cout << fixed << setprecision(6) << zeroRatio << endl; }
额外说明
- 范围for循环替代传统索引循环,既简化代码也避免索引错误
- 将计算结果单独存储,让逻辑更清晰,便于调试
- 使用double计算后,精度完全覆盖题目允许的误差范围,不会因舍入问题导致测试失败
内容的提问来源于stack exchange,提问作者Leslie Castelan Chavez
相关产品推荐
相关产品推荐

