按比例分配(按比例分配)一组值的值

时间:2011-08-15 19:28:36

标签: c# math

  

可能重复:
  Proportionately distribute (prorate) a value across a set of values

我一直在寻找一种算法,根据C#中一年中的天数来每月分配总金额,以便所有比例的总和等于总价值。

一年内的日期范围,总金额。

示例:

for a value 19550 and date range 9/1/2011 to 6/30/2012
September   1,929.28
October 1,993.59
November    1,929.28
December    1,993.59
January 1,993.59
February    1,864.97 - 28 days
March   1,993.59 - 31 days
April   1,929.28 - 30 days
May 1,993.59
June    1,929.28

但总数为19,550.04,比总数多.04。

3 个答案:

答案 0 :(得分:1)

可能的相关SO答案:Proportionately distribute (prorate) a value across a set of values

奇怪它与你的问题具有相同的标题......

答案 1 :(得分:1)

与Ricky一起回答:

并非总是可以在特定时间段内均匀分配给定量。实际上,在给定的时间段内数量均匀分布是非常罕见的。

这通常通过允许最后一个数字小于平均正常数来弥补差额来计算。

例如,在您的情况下,6月的金额应为1929.24。

通常,您在构建图表时会跟踪金额分配。一旦你到达终点,你可以选择。允许金额更高或者再支付一笔更低的金额。

基本上,您需要更改生成每月金额的算法。在那里签一份,以确保您计算的金额仍然可用。如果它没有取两个值中较低的值。

答案 2 :(得分:0)

听起来你已经有了比例分配的代码;但是你正在四舍五入到最近的分数,所以你现在所需要的只是得到你想要的总和。我有两个想法:

  1. 只需计算您想要的总数与您获得的总数之间的差异,然后将该金额添加到其中一个月
  2. 计算一个月的值后,将其从总计中删除。例如,在计算9月的值1929.28后,从19550减去1929.28并从天数中减去30。现在您的问题发生了变化:您不必在2011年9月1日至2012年6月30日期间分配19550,而是必须在10/1/2011到6/30/2012分配17620.72。舍入误差自然会以这种方式消失,因为最后一个月将获得剩余的100%。