Quelle est la meilleure façon de résoudre ce problème dans le code?Arrondir les problèmes avec l'allocation des montants en dollars entre plusieurs personnes
Le problème est que j'ai 2 montants en dollars (appelés pot), qui doivent être alloués à 3 personnes. Chaque personne reçoit un montant spécifique qui provient des deux pots et les taux doivent être à peu près les mêmes. Je rencontre toujours des problèmes d'arrondis où mes allocations sont trop élevées ou insuffisantes.
Voici un exemple précis:
Pot # 1 987,654.32
Pot # 2 123,456.78
Personne # 1 obtient Allocation Montant: 345,678.89
Personne # 2 obtient Allocation Montant: 460,599.73
Personne # 3 obtient Allocation Montant: 304,832.48
Ma logique est la suivante (le code est en 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;
}
}
}
Les résultats que je reçois sont les suivants:
Pot # 1, personne # 1 = 307,270.13
Pot # 1, personne # 2 = 409,421.99
Pot # 1, personne # 3 = 270,962.21
pot # 1 total = 987,654.33 (1 penny off)
pot # 2, personne # 1 = 38,408.76
pot # 2, personne # 2 = 51,177.74
pot # 2, personne # 3 = 33,870.27
pot # 2 Total = 123 456,77 (1 penny off)
Les totaux de pot doivent correspondre aux totaux d'origine.
Je pense que je peux manquer quelque chose ou il y a peut-être une étape supplémentaire que je dois prendre. Je pense que je suis sur la bonne voie.
Toute aide serait grandement apprécié.
Vous pouvez voir cet article que je l'ai écrit sur la façon de gérer cela dans SQL: [Financial Arrondi d'attribution] (http://www.sqlservercentral.com/articles/Financial+Rounding/88067 /) –