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

加權(quán)平均數(shù)公式是:
其中:
- ? 是對(duì)應(yīng)的權(quán)重
C# 實(shí)現(xiàn)思路
核心思路:
- ? 一組是對(duì)應(yīng)的權(quán)重(如每門課占總成績(jī)的比例)
- 2. 驗(yàn)證兩組數(shù)據(jù)長(zhǎng)度一致。
- 3. 計(jì)算「值 * 權(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 門課程成績(jī)及其權(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)平均成績(jī):{weightedAverage:F2}");
}
/// <summary>
/// 計(jì)算加權(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)重集合的長(zhǎng)度必須一致。");
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ù)值和對(duì)應(yīng)權(quán)重。 - ?
CalculateWeightedAverage
方法: - ? 驗(yàn)證輸入:保證兩個(gè)列表長(zhǎng)度一致,且不為空。
- ? 用循環(huán)累加
值 * 權(quán)重
,同時(shí)累加權(quán)重之和。
- ?
Console.WriteLine
用 :F2
保留兩位小數(shù)輸出。
---
擴(kuò)展:使用 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)重長(zhǎng)度必須一致。");
double weightedSum = values.Zip(weights, (v, w) => v * w).Sum();
double weightSum = weights.Sum();
if (weightSum == 0)
thrownew DivideByZeroException();
return weightedSum / weightSum;
}
這里用到了:
- ?
Zip
:把兩個(gè)列表一一配對(duì)。
適用場(chǎng)景舉例
- ? 計(jì)算期末總成績(jī)(不同科目占比不同)
- ? 統(tǒng)計(jì)某產(chǎn)品線不同產(chǎn)品對(duì)總銷售額的貢獻(xiàn)
總結(jié)
本次內(nèi)容涵蓋以下關(guān)鍵點(diǎn):
- ? 加權(quán)平均數(shù)的概念解析與計(jì)算公式
- ? C# 語(yǔ)言的具體實(shí)現(xiàn)方案
- ? 實(shí)際應(yīng)用場(chǎng)景分析
歡迎關(guān)注,我們后面繼續(xù)研究【移動(dòng)加權(quán)平均算法】
參考內(nèi)容
百科-加權(quán)平均值
閱讀原文:原文鏈接
該文章在 2025/7/18 10:45:53 編輯過(guò)