如何使用javascript查找贷款中的期间数

如何使用javascript查找贷款中的期间数,javascript,math,calculator,Javascript,Math,Calculator,为什么以下函数对超过6位的贷款金额值不起作用?为什么它会产生不正确的结果 e、 g.如果我输入以下内容 Loan amount: 1,000,000 Interest Rate: 1.09 Monthly Payment: 1,500 结果是:85.39 当我输入超过7位数字时,它返回NaN,例如贷款金额:10000000 function myFunction() { rte = eval (1.09)/1200; pmt = eval (1500); amt = e

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

e、 g.如果我输入以下内容

Loan amount: 1,000,000
Interest Rate: 1.09
Monthly Payment: 1,500
结果是:85.39

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

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;
}

您可以在这里查看

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

  • 输出与您的问题无关,因此我们将此部分从函数中删除
  • 全局变量不好,硬编码也不好,所以让我们把它们设为函数参数
  • 这里根本不需要使用
    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);
    
    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]
    
    接下来,我们可以处理函数代码itseft:

  • 让我们删除冗余和大括号
  • 让我们把参数名缩短,这样看起来更像数学
  • 让我们(临时)添加一些调试信息
  • 结果:

    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);
    
    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
    reference]()中所看到的,如果您提供负值作为参数,则始终会得到NaN


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

    为什么你以神圣的名义使用
    eval()
    和一个整数参数?我正在从文本框中读取这些值,所以使用eval(),如果你删除了“无所谓”,结果在这个公式中不会改变。你知道为什么它会显示NaN吗?当金额大于7位数时,您的NPER公式不正确,请查看此网页了解正确的公式,请不要使用1.09作为费率值,因为它将被视为109%,而不是9%