¿Cuál es la mejor manera de resolver este problema en el código?Problemas de redondeo con la asignación de cantidades en dólares en varias personas
El problema es que tengo 2 cantidades en dólares (conocidas como pot), que deben asignarse a 3 personas. Cada persona recibe una cantidad específica que proviene de ambas ollas y las tasas deben ser aproximadamente las mismas. Sigo encontrando problemas de redondeo en los que mis asignaciones suman demasiado o muy poco.
Aquí está un ejemplo específico:
Pot # 1 987,654.32
Pot # 2 123,456.78
Persona # 1 obtiene Asignación Monto: 345,678.89
Persona # 2 recibe Asignación Monto: 460,599.73
Persona # 3 pone Asignación Monto: 304,832.48
Mi lógica es la siguiente (Código 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;
}
}
}
Los resultados que recibo son los siguientes:
Pot # 1, Persona # 1 = 307,270.13
Pot # 1, Persona # 2 = 409,421.99
Pot # 1, Persona # 3 = 270,962.21
Pot # 1 total = 987,654.33 (1 centavo off)
Pot # 2, Persona # 1 = 38,408.76
Pot # 2, Persona # 2 = 51,177.74
Pot # 2, Persona # 3 = 33,870.27
Pot # 2 Total = 123,456.77 (1 céntimo de descuento)
Los totales de pot deben coincidir con los totales originales.
Creo que me puede estar perdiendo algo o puede haber un paso adicional que deba tomar. Creo que estoy en el camino correcto.
Cualquier ayuda sería muy apreciada.
Es posible que desee ver este artículo que escribí sobre la manera de manejar esto en SQL: [Redondeo financiera de atribución] (http://www.sqlservercentral.com/articles/Financial+Rounding/88067 /) –