稍微說點錢的事吧 - 分錢的方法 (2)
上次分錢時提到合理性的問題,分贓不公平可是人命關天的。
為什麼會說上次的作法不公平呢? 讓我們寫點程式碼,設計一道題目並把結果Print出來。
題目是上次就有提到的,三個持有20%股份和一個持有40%股份的人,去分1元的獲利,最小單位為1元。
static void Main(string[] args)
{
// 三個持有20%股份和一個持有40%股份的人,分1元的獲利
decimal[] factors = { 40, 20, 20, 20 };
decimal momey = 1;
BaseDivider divider = new MyDivider1();
decimal[] results = divider.Divide(factors, momey, 0);
// 印出結果
Console.WriteLine("MyDivider1");
printResult(factors, results, 1);
Console.ReadKey();
}
static void printResult(decimal[] factors, decimal[] values, decimal totalValue)
{
decimal fSum = factors.Sum();
decimal vUnit = totalValue / factors.Sum();
decimal diff2Sum = 0;
decimal valueSum = 0;
Console.WriteLine("\t{0}\t{1}\t{2}", "factor", "value", "Diff.");
for (int i = 0; i < factors.Length; i++)
{
decimal _diff = values[i] - factors[i] * vUnit;
diff2Sum += _diff * _diff;
valueSum += values[i];
Console.WriteLine("{0}\t{1}\t{2}\t{3:N4}",
i, factors[i], values[i], _diff);
}
Console.WriteLine();
Console.WriteLine("SUM:\t{0}\t{1}\t{2}\t{3}", fSum, valueSum, totalValue - valueSum, diff2Sum);
Console.WriteLine("Diff^2 Sum = {0}", diff2Sum);
}
印出的結果
MyDivider1 |
|||
id |
factor |
value |
Diff. |
0 |
40 |
0 |
-0.4 |
1 |
20 |
1 |
0.8 |
2 |
20 |
0 |
-0.2 |
3 |
20 |
0 |
-0.2 |
|
|
|
|
SUM: |
100 |
1 |
0 |
Diff^2 Sum = 0.8800 |
結果很正常:總共沒有多發錢、也把錢分完了、每個人的差也小於一元。
但仔細一看──這可奇怪了! 出40%的人沒分到錢,出20%的卻分到了!
這只是一個極端的例子。事實上,在其他的例子中,會出現"為什麼我比他多出10元、分利潤時我卻少他一元"這種不公平的情況發生。
解決方法容我賣個關子(其實是我打累了),下次再說吧!