我正在尝试使用费用表计算投资管理费。例如,假设投资金额为 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/