C# 在一组值之间按比例分配(按比例分配)一个值

C# 在一组值之间按比例分配(按比例分配)一个值,c#,math,C#,Math,可能重复: 我一直在寻找一种算法,根据一年中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 - 2

可能重复:

我一直在寻找一种算法,根据一年中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

但是总数是19550.04,比总数多0.04。

可能相关,所以回答:


奇怪的是,它和你的问题同名…

还有瑞奇的答案:

在一定的时间段内,并不总是能够平均分配给定的数量。事实上,一个数量在给定的时间段内均匀分布是非常罕见的

在金融中,为了弥补差额,通常允许最后一个数字小于平均正常数字

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

通常,在绘制图表时,您会跟踪金额分配。一旦你走到尽头,你就有了选择。要么允许金额更高,要么以更低的金额再支付一次


基本上,您需要更改生成每月金额的算法。在那里打勾,以确保您计算的金额仍然可用。如果不是,则取两个值中的较低值。

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

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

  • 我假设你的4美分来自四舍五入造成的损失……是否有一个通用的数学公式/算法?。如果我从每个月最高的总数中拿出1美分,看起来会更好吗?所以十月,十二月,三月,五月是1993年。58@shpop:我过去曾在摊销计划中处理过这一问题,该计划具有非常明确的算法。如果不知道你的实际使用情况,就不可能说出。你可以根据计算结果想象一个人每月收到的支票。一年的总金额应该与小数点四舍五入到2的总数完全匹配。@shpop:我实际上是在寻找确切的用例。然而,在雇佣支票的情况下,大多数公司都会额外支付一点(有时高达几美元)以保持公平。您可能只需要编写自己的代码并进行测试…谢谢。。。现在我将调整我的最后一个号码