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)
| 归档时间: |
|
| 查看次数: |
3856 次 |
| 最近记录: |