C#计算double二维数组每行平均值结果偏差问题求解
问题解答
首先你怀疑的数组声明语句double[,] dTaulu = new double[5, 4];没有任何问题。
- 数组维度参数要求是Int32类型是合理的:5和4分别代表二维数组的行数、列数,数组的长度、索引都只能是整数,不存在2.5行、1.2列这种定义,所以参数必须是整数类型。
你的计算结果偏差大的根本原因是运算符优先级错误:C#中除法/的运算优先级高于加法+,你写的平均值计算式实际执行的逻辑是「前三个元素直接相加 + 第四个元素除以4的结果」,比如dTaulu[0,0] + dTaulu[0,1] + dTaulu[0,2] + dTaulu[0,3] / 4等价于dTaulu[0,0] + dTaulu[0,1] + dTaulu[0,2] + (dTaulu[0,3] / 4),根本不是四个数的总和除以4,结果自然和正确值差很多。
另外你的代码还有两处可以优化的冗余问题:
- 循环变量
i、j完全没必要声明为double类型,数组索引本身就是整数,直接用int类型声明即可,省掉每次访问数组时的强制类型转换操作。 - 你写了5个独立的外层for循环,每个循环只遍历固定一行,逻辑完全重复,可以合并成一个外层循环遍历所有行,不用重复写5遍几乎一致的代码。
修正方案
快速修复原有逻辑
给每行四个元素的求和部分整体加上括号,保证先算总和再做除法,以第一行为例:
double average1 = (dTaulu[0,0] + dTaulu[0,1] + dTaulu[0,2] + dTaulu[0,3]) / 4;
其余四行的平均值计算都按这个格式给求和部分加括号,就能得到正确结果。
使用Average()方法的实现
注意二维数组不能直接调用Average()方法,这个方法是LINQ提供的扩展方法,只支持一维可枚举序列,需要先提取每行的所有元素再调用,使用前要先引入System.Linq命名空间。
完整优化后的代码如下:
using System; using System.Linq; // 必须引入这个命名空间才能使用Average方法 class Program { static void Main(string[] args) { double[,] dTaulu = new double[5, 4]; // 把星期对应的芬兰语存在数组里,避免重复写5次输入逻辑 string[] dayNames = {"maanantain", "tiistain", "keskiviikon", "torstain", "perjantain"}; // 合并后的双层循环,遍历所有行和列录入数据 for (int i = 0; i < 5; i++) { for (int j = 0; j < 4; j++) { Console.Write($"Anna {dayNames[i]} {j + 1} sademäärä: "); dTaulu[i, j] = double.Parse(Console.ReadLine()); } } // 按行计算平均值 double[] dayAverages = new double[5]; int columnCount = dTaulu.GetLength(1); // 获取二维数组的列数 for (int i = 0; i < dTaulu.GetLength(0); i++) // GetLength(0)获取二维数组的行数 { double[] currentRow = new double[columnCount]; for (int j = 0; j < columnCount; j++) { currentRow[j] = dTaulu[i, j]; } dayAverages[i] = currentRow.Average(); } Console.WriteLine($"Maanantai: {dayAverages[0]} mm\nTiistai: {dayAverages[1]} mm\nKeskiviikko: {dayAverages[2]} mm\nTorstai: {dayAverages[3]} mm\nPerjantai: {dayAverages[4]} mm"); Console.ReadKey(); } }
内容的提问来源于stack exchange,提问作者Samuli Kuusisto
相关产品推荐
相关产品推荐

