Каков наилучший способ решить эту проблему в коде?Вопросы округления с распределением сумм доллара между несколькими людьми
Проблема в том, что у меня есть сумма в 2 доллара (известная как банк), которую необходимо выделить 3 людям. Каждый человек получает определенную сумму, которая поступает из обоих горшков, и ставки должны быть примерно одинаковыми. Я продолжаю сталкиваться с проблемами округления, когда мои ассигнования либо слишком много, либо слишком малы.
Вот конкретный пример:
Пот # 1 987,654.32
Pot # 2 123,456.78
Лицо № 1 получает Allocation Суммы: 345,678.89
Лица № 2 получает Allocation Суммы: 460,599.73
Person # 3 получает сумму ассигнований: 304,832.48
Моя логика выглядит следующим образом (код находится в 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;
}
}
}
Результаты я получаю следующим образом:
Пот # 1, Person # 1 = 307,270.13
Пот # 1, Person # 2 = 409,421.99
Пот # 1, Person # 3 = 270,962.21
Пот # 1 Итого = 987,654.33 (1 пенни выключен)
Пот # 2, Человек # 1 = 38,408.76
Пот # 2, Человек # 2 = 51,177.74
Пот # 2, Человек # 3 = 33,870.27
Пот # 2 Итого = 123 456,77 (1 пенни за вычетом)
Итоговые суммы пота должны соответствовать первоначальным суммам.
Я думаю, что я могу что-то упустить или может быть дополнительный шаг, который мне нужно принять. Я думаю, что я на правильном пути.
Любая помощь была бы принята с благодарностью.
Вы можете увидеть эту статью, которую я написал о том, как справиться с этим в SQL: [Финансовое Округление распределения] (http://www.sqlservercentral.com/articles/Financial+Rounding/88067 /) – 2012-05-02 03:48:23