围绕多个人分配美元金额的问题

Jon*_*Jon 7 .net c# puzzle rounding

在代码中解决此问题的最佳方法是什么?

问题是我有2美元的金额(称为底池),需要分配给3个人.每个人获得来自两个盆的特定数量,并且费率必须大致相同.我不断遇到问题,我的分配加起来太多或太少.

这是一个具体的例子:

锅#1 987,654.32
锅#2 123,456.78

人员#1获得分配金额:345,678.89
人员#2获得分配金额:460,599.73
人员#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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我得到的结果如下:

锅#1,人#1 = 307,270.13
锅#1,人#2 = 409,421.99
锅#1,人#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便士关)

Pot Totals应与原始总数相匹配.

我想我可能会遗漏一些东西,或者我可能需要采取额外措施.我想我走在正确的轨道上.

任何帮助将不胜感激.

Mat*_*ley 13

四舍五入到最近的便士时,这在财务计算中会发生很多.对于每种情况,不会对各个操作舍入算法进行调整.

您必须有一个累加器来跟踪舍入和分配操作后分配的金额.在分配结束时,根据实际结果检查累加器(总结在一起)并分配剩余的便士.

在下面的数学示例中,如果你取0.133并将其四舍五入到0.13并且加3次,你会得到一分钱,而不是先增加0.133 3次然后再舍入.

 0.13    0.133
 0.13    0.133
+0.13   +0.133
_____   ______
 0.39    0.399 -> 0.40
Run Code Online (Sandbox Code Playgroud)