javascript - 如何计算混合费用?

标签 javascript math

我正在尝试使用费用表计算投资管理费。例如,假设投资金额为 5,000,000 美元,费用表如下:

  • 1,000,000 及以下:1.00%
  • 2,000,000:0.75%
  • 3,000,000:0.50%
  • 3,000,001+:0.25%

1,000,000 美元以下收取 1.00%,超过 3,000,000 美元收取 0.25%。我需要使用 javascript 得出混合价格(在这种情况下答案是 0.55% 或 27,500 美元)。

如果我们以 5,000,000 美元为例,费用表如上,您如何得出答案?

  • 1,000,000 美元 * 0.0100 = 10,000 美元(前 100 万美元的费用)
  • 1,000,000 美元 * 0.0075 = 7,500 美元(第二个 100 万美元的费用)
  • 1,000,000 美元 * 0.0050 = 5,000 美元(第三个 100 万美元的费用)
  • 2,000,000 美元 * 0.0025 = 5,000 美元(超过 300 万美元的所有金额)

因此,要管理这 5,000,000 美元,成本将是上述费用的总和(27,500 美元)。 27,500 美元/5,000,000 美元 = 0.55%,这是我们的“混合费用”。

需要注意的是,并非每个费用表都与此完全相同。有些有不同的费用和限制。

到目前为止,我对这个问题的研究结果是什么?我还没有找到可以在 SO 上完成此功能的质量示例。似乎所有基于 SO 的分层定价计算都只能确定给定数量的商品的单一价格,而不是混合价格,尽管就像我在这里试图实现的那样。

我的费用表可能看起来像这个数组:

fee_schedule: [
{ fee: 0.0100, limit: 1000000},
{ fee: 0.0075, limit: 2000000},
{ fee: 0.0050, limit: 3000000},
{ fee: 0.0025, limit: Infinity}
]

这是我开始的方向,但是因为我看到自己写了一个长得可笑的函数而在我的脑海中撞墙。

function determineFee(schedule, amount) {
   schedule.forEach(tier => {
    if (amount <= tier.limit) {
     // is this a path I should go down?
    }
   }
  //
}

最佳答案

您可以构建最后一个或零和实际限制的增量,或者如果它是最后一个元素,则取 Infinity,以便使用剩余值(value)的费用。

然后检查该值是否小于增量。如果为真,则计算剩余值的费用并结束循环。

否则从 delta 计算费用,用 delta 递减该值并将限制分配为最后一个值,以便为下一个循环使用该值。

function getFee(value) {
    var fee = 0;

    fee_schedule.some((o, i, a) => {
        var delta = i + 1 === a.length
                ? Infinity
                : o.limit - (a[i - 1] && a[i - 1].limit || 0);

        if (value < delta) {
            fee += value * o.fee;
            return true;
        }
        fee += delta * o.fee;
        value -= delta;
    });

    return fee;
}

var fee_schedule = [{ fee: 0.0100, limit: 1000000 }, { fee: 0.0075, limit: 2000000 }, { fee: 0.0050, limit: 3000000 }, { fee: 0.0025, limit: 4000000 }],
    value = 5000000,
    fee = getFee(value);

console.log(fee);

对于更短的方法,您可以更改数据集并仅使用限制的插槽大小,前三个时间为 100 万,最后一个时间为 Infinity

function getFee(value) {
    var sum = 0;

    fee_schedule.some(({ fee, limit }) => {
        var v = value < limit ? value : limit;
        sum += v * fee;
        return !(value -= v);
    });

    return sum;
}

var fee_schedule = [{ fee: 0.0100, limit: 1000000 }, { fee: 0.0075, limit: 1000000 }, { fee: 0.0050, limit: 1000000 }, { fee: 0.0025, limit: Infinity }],
    value = 5000000,
    fee = getFee(value);

console.log(fee);

关于javascript - 如何计算混合费用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54933647/

相关文章:

javascript - 通过 Jquery 的日期格式

algorithm - 与大O有关的困惑

python - 具有间隙的信号的功率谱密度?

javascript - 在同构 javascript 中处理 HTTP 请求

javascript - 如何在javascript中创建自定义对象的公共(public)常量实例?

php - 我遇到有关使用数组 php 进行数学运算的问题

python - 在 NumPy 中旋转晶体

c - 在 C 中将整数转换为 double 会产生零值

javascript - Parse.com后台作业云代码无法调用未定义的方法 'then'

javascript - (#601) 解析器错误 : unexpected end of query - Javascript FB. API