今天我們討論一個數(shù)學問題“加權(quán)平均法”。
在數(shù)據(jù)分析、考試成績計算、統(tǒng)計學和金融等場景中,經(jīng)常會用到 加權(quán)平均(Weighted Average) 算法。相比簡單平均數(shù),加權(quán)平均數(shù)能根據(jù)不同數(shù)據(jù)的重要程度(權(quán)重)計算更準確的結(jié)果。
本文將一步步實現(xiàn)一個通用的 C# 加權(quán)平均數(shù)計算方法,附帶完整示例代碼,并解析每一處實現(xiàn)細節(jié),幫助我們舉一反三,靈活運用在實際項目中。
什么是加權(quán)平均?

加權(quán)平均數(shù)公式是:
其中:
C# 實現(xiàn)思路
核心思路:
- ? 一組是對應(yīng)的權(quán)重(如每門課占總成績的比例)
- 5. 用加總除以權(quán)重總和,得到加權(quán)平均數(shù)。
完整示例代碼
下面是使用 C# 10 編寫的示例,兼容 .NET 6 及以上:
using System;
using System.Collections.Generic;
using System.Linq;
namespaceWeightedAverageDemo
{
classProgram
{
static void Main(string[] args)
{
// 示例:3 門課程成績及其權(quán)重
List<double> scores = new List<double> { 85, 92, 78 };
List<double> weights = new List<double> { 0.3, 0.5, 0.2 };
double weightedAverage = CalculateWeightedAverage(scores, weights);
Console.WriteLine($"加權(quán)平均成績:{weightedAverage:F2}");
}
/// <summary>
/// 計算加權(quán)平均數(shù)
/// </summary>
/// <param name="values">值集合</param>
/// <param name="weights">權(quán)重集合</param>
/// <returns>加權(quán)平均數(shù)</returns>
static double CalculateWeightedAverage(List<double> values, List<double> weights)
{
if (values == null || weights == null)
thrownew ArgumentNullException("values 和 weights 不能為空。");
if (values.Count != weights.Count)
thrownew ArgumentException("值集合和權(quán)重集合的長度必須一致。");
double weightedSum = 0;
double weightSum = 0;
for (int i = 0; i < values.Count; i++)
{
weightedSum += values[i] * weights[i];
weightSum += weights[i];
}
if (weightSum == 0)
thrownew DivideByZeroException("權(quán)重之和不能為零。");
return weightedSum / weightSum;
}
}
}
代碼解析
- ?
List<double> scores
和 List<double> weights
:用于存放數(shù)據(jù)值和對應(yīng)權(quán)重。 - ?
CalculateWeightedAverage
方法: - ? 用循環(huán)累加
值 * 權(quán)重
,同時累加權(quán)重之和。
- ?
Console.WriteLine
用 :F2
保留兩位小數(shù)輸出。
---
擴展:使用 LINQ 重寫
如果你想用更函數(shù)式的寫法,也可以用 LINQ:
static double CalculateWeightedAverageLinq(List<double> values, List<double> weights)
{
if (values == null || weights == null)
thrownew ArgumentNullException();
if (values.Count != weights.Count)
thrownew ArgumentException("值和權(quán)重長度必須一致。");
double weightedSum = values.Zip(weights, (v, w) => v * w).Sum();
double weightSum = weights.Sum();
if (weightSum == 0)
thrownew DivideByZeroException();
return weightedSum / weightSum;
}
這里用到了:
適用場景舉例
- ? 統(tǒng)計某產(chǎn)品線不同產(chǎn)品對總銷售額的貢獻
總結(jié)
本次內(nèi)容涵蓋以下關(guān)鍵點:
- ? 加權(quán)平均數(shù)的概念解析與計算公式
歡迎關(guān)注,我們后面繼續(xù)研究【移動加權(quán)平均算法】
參考內(nèi)容
百科-加權(quán)平均值
閱讀原文:原文鏈接
該文章在 2025/7/18 10:45:53 編輯過