1

为什么以下函数对超过 6 位的贷款金额值不起作用,为什么会产生不正确的结果

例如,如果我输入以下

Loan amount: 1,000,000
Interest Rate: 1.09
Monthly Payment: 1,500

结果是:85.39

当我输入超过 7 位时,它返回NaN例如贷款金额:10,000,000

function myFunction()
{
    rte = eval (1.09)/1200;
    pmt = eval (1500);
    amt = eval (1000000);

    document.getElementById("demo").innerHTML=(Math.log(1+(rte/(pmt/(amt)-rte)))/Math.log(1+rte))/12;
}

你可以在这里查看 JsFiddle 链接

4

1 回答 1

2

好的,让我们仔细看看你的代码,因为它有一些错误。首先,我们对其进行重构:

  1. 输出与您的问题无关,因此我们将这部分从函数中删除。
  2. 全局变量不好,硬编码不好,所以让它们成为函数参数。
  3. 完全不需要在eval这里使用。
  4. 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 上工作:

  1. 让我们删除多余的大括号
  2. 让参数名称更短,这样看起来更像数学
  3. 让我们(临时)添加一些调试信息。

结果:

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 .

所以,不仅你的代码不好,而且公式也是错误的

于 2013-06-22T06:52:46.353 回答