为什么这些JavaScript方程会输出不同(但几乎相同)的答案?

时间:2019-04-19 02:31:54

标签: javascript math

因此,我试图绘制一段时间内的收入图表,其中包括“加薪”。

例如我一年收入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。任何帮助将不胜感激。我想我只是在某种程度上变得愚蠢,所以请继续向我大声疾呼。

1 个答案:

答案 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);
}