因此,我试图绘制一段时间内的收入图表,其中包括“加薪”。
例如我一年收入100美元,每年加薪1%(非复合)。该图将显示未来50年左右的每年的总收入。 所以100、201、303等
我的问题是,为什么所有这些方程式都得出几乎相同但不完全相同的答案。我猜我的逻辑可能是错误的,但是我已经坚持了大约两个星期,看不到我的错误。
let b = {
key: 'value',
key2: 'value2'
}
let a = Object.assign({}, b)
a.key2 = '123'
console.log(a.key2 == b.key2) // false
// a: {key: "value", key2: "123"}
// b: {key: "value", key2: "value2"}
结果:
//This adds the income from 3 months at 1% to another 12 months at 1%
console.log(interestCalc(100.00 * (3.00/12), (1.00/365), ((365.00/12) * 3)) + interestCalc(100.00, (1.00/365), ((365.00/12) * 3) + 365));
//This adds the income from 4 months at 1% to another 11 months at 1%
console.log(interestCalc(100.00 * (4.00/12), (1.00/365), ((365.00/12) * 4)) + interestCalc(100.00 * (11.00/12), (1.00/365), ((365.00/12) * 4) + ((365.00/12) * 11)));
//This adds the income from 10 months at 1% to another 5 months at 1%
console.log(interestCalc(100.00 * (10.00/12), (1.00/365), ((365.00/12) * 10)) + interestCalc(100.00 * (5.00/12), (1.00/365), ((365.00/12) * 10) + ((365.00/12) * 5)));
//This adds the income from 12 months at 1% to another 3 months at 1%
console.log(interestCalc(100.00, (1.00/365), 365) + interestCalc(100.00 * (3.00/12), (1.00/365), 365 + ((365.00/12) * 3)));
function interestCalc(principal, interestRate, time)
{
interestRate = interestRate * 0.01;
return principal + (principal * interestRate * time);
}
-------------------------------------------------------------------
考虑到所有等式都应该给出15个月的收入,我不明白为什么它们都不都是126.3125。任何帮助将不胜感激。我想我只是在某种程度上变得愚蠢,所以请继续向我大声疾呼。
答案 0 :(得分:2)
让我们先重新排列您的输入,然后使其变为“ DRY”
由于time
的目的是天数(使用整个月),所以传入月数,然后让函数乘以365 / 12
-在函数中,它是{{ 1}},因为这还可以处理将利率除以100
计算中的本金也乘以数月,因此让我们传递此数字,第一个传递3和12,第二个传递4和11,这样函数现在也可以处理-这就是最后一个365 / 1200
在功能中
* m / 12.0
这与您的代码输出相同(除了最低有效位,因为操作顺序以及javascript中的浮点与任何其他浮点一样,但这并不重要)
现在,让我们简化
删除常量,因为它们是常量...
//This adds the income from 3 months at 1% to another 12 months at 1%
console.log(
interestCalc(100.00, 3, (1.00/365), 3) +
interestCalc(100.00, 12, (1.00/365), 15)
);
//This adds the income from 4 months at 1% to another 11 months at 1%
console.log(
interestCalc(100.00, 4, (1.00/365), 4) +
interestCalc(100.00, 11, (1.00/365), 15)
);
//This adds the income from 10 months at 1% to another 5 months at 1%
console.log(
interestCalc(100.00, 10, (1.00/365), 10) +
interestCalc(100.00, 5, (1.00/365), 15)
);
//This adds the income from 12 months at 1% to another 3 months at 1%
console.log(
interestCalc(100.00, 12, (1.00/365), 12) +
interestCalc(100.00, 3, (1.00/365), 15)
);
function interestCalc(principal, m, interestRate, time)
{
return (principal + (principal * interestRate * time * 365 / 1200)) * m / 12.0;
}
由于function interestCalc(principal, m, interestRate, time)
{
return (principal + (principal * interestRate * time)) * m;
}
和我的写法interestRate
始终相同,请删除它们
principal
现在,结果是
function interestCalc(principal, m, interestRate, time)
{
return time * m;
}
如果您认为全部4个结果相同,就会发现计算有缺陷
很明显,匹配的两个计算实际上也是错误的
话虽如此,我并没有尝试找出正确的公式,因为我不确定自己要达到的目标
再次阅读问题,我什至看不到您的代码与您要实现的目标之间的关系
我假设这是您想要做的-当3、4、10或12个月后出现涨幅时,您要计算工资-也就是说,涨薪可能是一年中的一部分
不增加,每年15个月每年100就是100 * 15/12 = 125
因此,每个拆分的值应大于125(由于增加),但是随着您有更多的时间以较低的速率播放,该值将接近125
您希望前15个月的最长期限为前三个月25个月,接下来的12个月为101个月
最小值为12个月100个+ 3个月101/4为25.25,总计125.25
因此,所有计算都必须介于125.25和126.00之间
使用上面的代码,并更改 3 * 3 + 12 * 15 === 189
4 * 4 + 11 * 15 === 181
10 * 10 + 5 * 15 === 175
12 * 12 + 3 * 15 === 189
函数:
interestCalc
如您所见,它们都在该范围内
现在,让它变得更聪明
console.log(
interestCalc(100.00, 3, 0) +
interestCalc(100.00, 12, 1)
);
console.log(
interestCalc(100.00, 4, 0) +
interestCalc(100.00, 11, 1)
);
console.log(
interestCalc(100.00, 10, 0) +
interestCalc(100.00, 5, 1)
);
console.log(
interestCalc(100.00, 12, 0) +
interestCalc(100.00, 3, 1)
);
function interestCalc(principal, time, interestRate) {
return (principal + principal * interestRate / 100) * time / 12;
}
但这只允许总共12到23个月
所以,让它变得更聪明,因为现在我们甚至可以管理两个或更多的涨幅(即,跨越2个或更多的工资涨幅)
console.log(calc(100, 3, 1, 15));
console.log(calc(100, 4, 1, 15));
console.log(calc(100, 10, 1, 15));
console.log(calc(100, 12, 1, 15));
function calc(base, firstYearMonths, increase, totalMonths) {
return (base * firstYearMonths / 12) + (base * (increase + 100) / 100 * (totalMonths - firstYearMonths) / 12);
}