我正尝试使用费用表来计算投资管理费。例如,假设投资额为5,000,000美元,这是费用表:
1,000,000美元以下的美元收取1.00%,3,000,000美元以上的美元收取0.25%。我需要提出使用javascript的混合价格(这种情况下的答案是0.55%,也就是$27,500美元)。
如果我们所用的金额是$5,000,000和上面的费用表,你如何得到答案?
因此,为了管理这5,000,000美元,费用将是上述费用的总额(27,500美元)。和$27,500 / $5,000,000 = 0.55%,这是我们的“混合费用”。
不过,并不是每一个收费表都是这样的。有些则有不同的收费和限额。
到目前为止,我对这个问题的研究结果如何?我还没有找到一个高质量的例子,说明这样的函数可以完成这个任务。似乎所有的分层定价计算,所以只确定一个单一的价格,为给定数量的项目,而不是一个混合价格,虽然我试图在这里实现。
我的收费表可能看起来类似于这样的数组:
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?
}
}
//
}发布于 2019-02-28 20:52:51
您可以构建最后一个或零和实际限制的增量,或者如果它是最后一个元素,则以Infinity作为剩余值的费用。
然后检查值是否较小,然后检查增量。如果为true,则计算rest值的费用并结束循环。
否则,从增量计算费用,减少增量的值,并将限制赋值为最后一个值,以便在下一个循环中具有此值。
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);
发布于 2019-02-28 22:05:04
以下是另一种可能性:
const blended = (schedule) => (amount) =>
schedule.reduce ((sum, {fee, limit}, idx, sched) => {
const top = Math.min (limit, amount)
const bottom = idx == 0 ? 0 : sched[idx - 1].limit
return sum + (top > bottom ? fee * (top - bottom) : 0)
}, 0)
const blendedFee = (schedule) => {
const calc = blended(schedule)
return (amount) => calc(amount) / amount
}
const fee_schedule = [
{ fee: 0.0100, limit: 1000000},
{ fee: 0.0075, limit: 2000000},
{ fee: 0.0050, limit: 3000000},
{ fee: 0.0025, limit: Infinity}
]
console.log (blended (fee_schedule) (5000000))
console.log (blendedFee (fee_schedule) (5000000))
请注意,这些都是仓促的,因此,如果需要将这些引用用于各种贷款金额,则可以存储对blended (fee_schedule)或blendedFee (fee_schedule)的引用。
这并不包括尼娜的回答聪明的早期逃避,但我认为这更容易理解。
https://stackoverflow.com/questions/54933647
复制相似问题