好的,让我们仔细看看你的代码,因为它有一些错误。首先,我们对其进行重构:
- 输出与您的问题无关,因此我们将这部分从函数中删除。
- 全局变量不好,硬编码不好,所以让它们成为函数参数。
- 完全不需要在
eval
这里使用。
- myFunction 是无用的名称。
结果:
function calcLoan(rte, pmt, amt)
{
return (Math.log(1+(rte/(pmt/(amt)-rte)))/Math.log(1+rte))/12;
}
document.getElementById("demo").innerHTML = calcLoan(1.09/1200, 1500, 1000000);
接下来,我们可以在功能代码 iteft 上工作:
- 让我们删除多余的大括号
- 让参数名称更短,这样看起来更像数学
- 让我们(临时)添加一些调试信息。
结果:
function calcLoan(r, p, a)
{
return Math.log( 1 + (r / (p/a - r) ) ) / Math.log(1 + r) / 12;
}
function debugLoan(r, p, a)
return [ p/a, Math.log( 1 + (r / (p/a - r) ) ), 1 + (r / (p/a - r) ), Math.log(1 + r) ];
}
// call
calcLoan( 1.09/1200, 1500, 1000000 );
//85.38526703746216
// call with bigger number
calcLoan( 1.09/1200, 1500, 10000000 );
// NaN, because we supply negative value to Math.log
// see it yourself
debugLoan( 1.09/1200, 1500, 10000000 );
// [0.00015, NaN, -0.19780219780219777, 0.0009079210482536982]
正如您在[Math.log
参考](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/log)中看到的 - 如果您提供负值作为参数,您将始终得到 NaN .
所以,不仅你的代码不好,而且公式也是错误的。