Qual è il modo migliore per risolvere questo problema nel codice?Problemi di arrotondamento con l'allocazione di importi in dollari su più persone
Il problema è che ho 2 importi in dollari (noto come un piatto), che devono essere assegnati a 3 persone. Ogni persona riceve un importo specifico che proviene da entrambi i piatti e le tariffe devono essere approssimativamente uguali. Continuo a riscontrare problemi di arrotondamento in cui le mie allocazioni si sommano troppo o troppo poco.
Ecco un esempio specifico:
Pot # 1 987,654.32
Pot # 2 123,456.78
persona # 1 ottiene Allocation Importo: 345,678.89
persona # 2 ottiene Allocation Importo: 460,599.73
persona # 3 ottiene Allocation Importo: 304,832.48
La mia logica è la seguente (codice è 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;
}
}
}
I risultati che ottengo sono i seguenti:
Pot # 1, persona # 1 = 307,270.13
Pot # 1, Persona # 2 = 409,421.99
Pot # 1, persona # 3 = 270,962.21
pot # 1 totale = 987,654.33 (1 centesimo off)
pot # 2, persona # 1 = 38,408.76
pot # 2, persona # 2 = 51,177.74
pot # 2, persona # 3 = 33,870.27
pot # 2 Totale = 123,456,77 (1 penny off)
I totali del piatto devono corrispondere ai totali originali.
Penso che possa mancare qualcosa o potrebbe esserci un ulteriore passaggio che devo fare. Penso di essere sulla strada giusta.
Qualsiasi aiuto sarebbe molto apprezzato.
Si consiglia di leggere questo articolo che ho scritto su come gestire questo in SQL: [Arrotondamento finanziaria delle assegnazioni] (http://www.sqlservercentral.com/articles/Financial+Rounding/88067 /) –