【问题标题】:Proportionately distribute (prorate) a value across a set of values [duplicate]在一组值中按比例分配(按比例分配)一个值[重复]
【发布时间】:2011-08-15 19:28:35
【问题描述】:

可能重复:
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,比总数多 0.04。

【问题讨论】:

  • 我会假设你的 4 美分来自四舍五入损失的钱......

标签: c# math


【解决方案1】:

连同瑞奇的回答:

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

这通常在财务中通过允许最后一个数字小于平均正常数字以弥补差异来解决。

例如,在您的情况下,六月的金额应该是 1929.24。

通常,您在构建图表时会跟踪金额分配。一旦你到达终点,你就有了选择。要么允许更高的金额,要么以更低的金额多支付一次。

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

【讨论】:

  • 是否有通用的数学公式/算法?如果我从每月最高的每个总额中抽取 1 美分,看起来会更好吗?所以 10 月、12 月、3 月、5 月是 1,993.58
  • @shpop:我在过去处理过这个具有非常明确的算法的摊销时间表。不知道你的实际使用情况是不可能说的。
  • 您可以根据计算得出一个人每月收到的支票。一年的总金额应与总金额完全匹配,小数点四舍五入为 2。
  • @shpop:我实际上是在寻找确切的用例。然而,在就业检查的情况下,大多数公司会额外支付一点(有时高达几美元)以保持平衡。您可能只需要编写自己的代码并进行测试。
  • ...谢谢...暂时我会调整我的最后一个数字
【解决方案2】:

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

奇怪它的标题和你的问题一样……

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2010-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多