Wie lässt sich dieses Problem am besten im Code lösen?
Das Problem ist, dass ich 2 Dollarbeträge (bekannt als Topf) habe, die auf 3 Personen aufgeteilt werden müssen. Jede Person erhält einen bestimmten Betrag, der aus beiden Töpfen stammt, und die Sätze müssen ungefähr gleich sein. Ich stoße immer wieder auf Rundungsprobleme, bei denen sich meine Zuweisungen entweder zu viel oder zu wenig summieren.
Hier ist ein konkretes Beispiel:
Topf Nr. 1 987.654,32
Topf #2 123.456,78
Person 1 erhält den Zuteilungsbetrag: 345,678.89
Person Nr. 2 erhält den Zuteilungsbetrag: 460,599.73
Person #3 erhält Zuteilungsbetrag: 304,832.48
Meine Logik ist wie folgt (Code ist in c#):
foreach (Person person in People)
{
decimal percentage = person.AllocationAmount / totalOfAllPots;
decimal personAmountRunningTotal = person.AllocationAmount;
foreach (Pot pot in pots)
{
decimal potAllocationAmount = Math.Round(percentage * pot.Amount, 2);
personAmountRunningTotal -= potAllocationAmount;
PersonPotAssignment ppa = new PersonPotAssignment();
ppa.Amount = potAllocationAmount;
person.PendingPotAssignments.Add(ppa);
}
foreach (PersonPotAssignment ppa in person.PendingPotAssignments)
{
if (personAmountRunningTotal > 0) //Under Allocated
{
ppa.Amount += .01M;
personAmountRunningTotal += .01M;
}
else if (personAmountRunningTotal < 0) //Over Allocated
{
ppa.Amount -= .01M;
personAmountRunningTotal -= .01M;
}
}
}
Die Ergebnisse sind wie folgt:
Topf 1, Person 1 = 307.270,13
Topf #1, Person #2 = 409.421,99
Topf #1, Person #3 = 270.962,21
Topf 1 insgesamt = 987.654,33 (1 Penny weniger)
Topf #2, Person #1 = 38.408,76
Topf #2, Person #2 = 51.177,74
Topf #2, Person #3 = 33.870,27
Topf #2 insgesamt = 123.456,77 (1 Penny weniger)
Die Summen der Töpfe sollten mit den ursprünglichen Summen übereinstimmen.
Ich glaube, ich übersehe etwas, oder es gibt vielleicht einen zusätzlichen Schritt, den ich tun muss. Ich denke, ich bin auf dem richtigen Weg.
Für jede Hilfe wären wir Ihnen sehr dankbar.