稍微說點錢的事吧 - 分錢的方法 (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元、分利潤時我卻少他一元"這種不公平的情況發生。
解決方法容我賣個關子(其實是我打累了),下次再說吧!