小数后第5位结果不符求助:C语言滑动窗口求最大平均
问题根源
核心问题是float类型的精度不足:float仅能提供约6-7位十进制有效数字,当数组元素累加后的总和数值较大时,小数部分的精度会被覆盖,最终导致计算出的平均值出现偏差。你遇到的558.29498与预期558.29496的差异,就是因为float在存储大总和时,无法精确保留足够的小数位。
你之前仅在返回时强制转double,但求和过程已经用float完成,精度损失早已经发生,所以改返回值类型没用。
修复方案
把存储总和的变量全部换成double类型,让整个计算过程都用更高精度的类型处理:
double findMaxAverage(int* nums, int numsSize, int k){ double maxSum = -2147483648.0; double currentSum = 0.0; for(int i=0; i < numsSize; i++){ currentSum += nums[i]; if(i >= k - 1){ if(currentSum > maxSum) maxSum = currentSum; currentSum -= nums[i - (k - 1)]; } } return maxSum/k; }
额外说明
- double类型有15-17位十进制有效数字,足以应对绝大多数场景下的累加精度需求,能彻底避免大数值累加时的精度丢失问题。
- 初始化
maxSum时写-2147483648.0是为了明确是浮点型赋值,避免整数转浮点时的潜在问题,也符合double类型的初始化规范。
内容的提问来源于stack exchange,提问作者Aryant Kumar
相关产品推荐
相关产品推荐

