【问题标题】:JavaScript mortgage loan calculator returning "NaN" for monthly paymentJavaScript 抵押贷款计算器返回“NaN”以进行每月还款
【发布时间】:2014-06-29 19:46:18
【问题描述】:

在过去的几天里,我一直在发疯,试图弄清楚这一点,我完全不知道该怎么办。

对于我必须为课堂做的作业,我们必须分析以下 JavaScript 代码并纠正错误。我已经设法弄清楚其中的大部分内容,但我被困在最后一部分。

每当我单击“计算”按钮时,它都会返回 "$NaN.undefined" 以获取每月付款金额。我一遍又一遍地查看代码,一切似乎都与我教科书中显示的内容相匹配,所以我不知道我需要更改什么才能使其正常工作。

几天前我刚开始学习 JavaScript,所以我在这方面还很陌生。任何人都可以给我的任何帮助或指导将不胜感激。

<!DOCTYPE html
PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-type" content="text/html;charset=UTF-8" /> 
<title>Make10-1 Oakwood Mortgage</title>
<script type="text/javascript">
<!--Hide from old browsers
var thisMsg="  ** See us for your auto loan financing needs!!! **  "
var beginPos=0
function scrollingMsg() {
   msgForm.scrollingMsg.value=thisMsg.substring(beginPos,thisMsg.length)+thisMsg.substring(0,beginPos)
   beginPos+=1
   if (beginPos > thisMsg.length) {
      beginPos=0
   }
   window.setTimeout("scrollingMsg()",200)
}

var salesAmt
var loanAmt
var loanRate
var loanYears

function valSaleDownAmt() {
    var salesAmt=parseInt(LoanCalc.SaleAmt.value,10)
    if (isNaN(salesAmt) || (salesAmt <=0)) {
        alert("The sales amount is not a valid number!")
        LoanCalc.SaleAmt.value = ""
        LoanCalc.SaleAmt.focus()
    }
    else {
        var DownPayment=parseFloat(LoanCalc.DownPmt.value)/100
        if (isNaN(DownPayment) || (DownPayment <= 0) || DownPayment > 100) {
           alert("The Down Payment Rate is not a valid number!")
           LoanCalc.DownPmt.value = " "
           LoanCalc.DownPmt.focus()
    }
        else {
            var amtDown = salesAmt*DownPayment
            var loanAmt = salesAmt-amtDown
            LoanCalc.LoanAmt.value = dollarFormat(loanAmt.toFixed(2))
            LoanCalc.Rate.focus()
        }
    }
}

function CalcLoanAmt() {
    loanRate=parseFloat(LoanCalc.Rate.value)
    if (isNaN(loanRate) || (loanRate <= 0)) {
        alert("The interest rate is not a valid number!")
        LoanCalc.Rate.value = ""
        LoanCalc.Rate.focus()
    }
    else {
        loanYears=parseInt(LoanCalc.Years.selectedIndex)
        if (isNaN(loanYears) || (loanYears < 1)) {
            alert("Please select a valid number of years from the list!")
            LoanCalc.Years.selectedIndex = "0"
            LoanCalc.Years.focus()
        }
        else {
        var monthlyPmt = monthly(loanAmt,loanRate,loanYears)
        LoanCalc.Payment.value=dollarFormat(monthlyPmt.toString())
        }
    }
}

function monthly(loanAmt,loanRate,loanYears) {
    var Irate = loanRate/1200
    var Pmts = loanYears*12
    var Amnt = loanAmt * (Irate / (1 - (1 / Math.pow(1+Irate,Pmts))))
    return Amnt.toFixed(2)
}

function dollarFormat(valuein) {
    var formatValue = ""
    var formatDollars = ""
    formatAmt = valuein.split(".",2)
    var dollars = formatAmt[0]
    var dollarLen = dollars.length
    if (dollarLen > 3) {
        while (dollarLen > 0) {
            tempDollars = dollars.substring(dollarLen - 3,dollarLen)
                if (tempDollars.length == 3) {
                    formatDollars = "," + tempDollars + formatDollars
                    dollarLen = dollarLen - 3
                } else {
                    formatDollars = tempDollars + formatDollars
                    dollarLen = 0
                }
            }
        if (formatDollars.substring(0,1) == ",")
            dollars = formatDollars.substring(1,formatDollars.length)
        else    
            dollars = formatDollars
        }
        var cents = formatAmt[1]
        var formatValue="$"+dollars+"."+cents
        return formatValue
    }

 function popUpAd() {
    open("make10-1notice.html","noticeWin","width=520,height=270")
 }

 function lastModified() {
    var lastModDate = document.lastModified
    var lastModDate = lastModDate.substring(0,10)
     displayDateLast.innerHTML="<span style='font-family:Arial, Helvetica, sans-serif; font-size:9px; font-weight:bold'>This document was last modified "+lastModDate+"</span>"
 }

//-->
</script>
<style type="text/css">
<!--
body {
background-image: url(financial_symbol.jpg);
}
-->
</style>
</head>
<body onload="scrollingMsg(); popUpAd(); lastModified()">
<div align="center">
<p align="center"><img src="make10-1banner.jpg" width="750" height="120" alt="banner" /></p>
<form id="msgForm" action="">
<p style="text-align:center"><input type="text" name="scrollingMsg" size="25" /></p>
</form>
</div>
<div style="font-family:Arial, Helvetica, sans-serif">
<h3 align="center">Home Loan Payment Calculator</h3>
<form id="LoanCalc" action="">
<table width="346" align="center" cellspacing="3">
    <tr>
       <td align="right">
          <span style="color:#cc0000">*</span>Sale Price:
       </td>
       <td><input type="text" name="SaleAmt" id="SaleAmt" size="9" /></td>
    </tr>
    <tr>
      <td align="right">
         <span style="color:#cc0000">*</span> Down Payment as a percent
      </td>
      <td><input name="DownPmt" type="text" id="DownPmt" size="4" onblur="valSaleDownAmt()" /> 
      %</td>
    </tr>
    <tr>
       <td align="right">
          <span style="color:#cc0000">*</span> Interest Rate (e.g. 5.9):
      </td>
       <td><input type="text" name="Rate" id="Rate" size="4" /> %  
       </td>
    </tr>
<tr>
       <td align="right">
          <span style="color:#cc0000">*</span> Select Number of Years:  
  </td>
       <td><select name="Years" id="Years">
         <option selected="selected">Select Years</option>
         <option value="10">10</option>
         <option value="15">15</option>
         <option value="20">20</option>
         <option value="25">25</option>
         <option value="30">30</option>
         <option value="40">40</option>
       </select></td>
    </tr>
    <tr>
       <td align="right">
         <input name="button" type="button" value="Calculate" onclick="CalcLoanAmt()" />
       </td>
       <td>
         <input name="Reset" type="reset" />
       </td>
    </tr>
    <tr>
      <td align="right">
         <span style="color:#cc0000">*</span> Loan Amount          
      </td>
      <td>
        <input name="LoanAmt" type="text" id="LoanAmt" size="9" />
      </td>
    </tr>
    <tr>
       <td align="right">
          <span style="font-weight:bolder">Monthly Payment</span>: 
       </td>
       <td><input type="text" name="Payment" id="Payment" value=" " size="12" /></td>
    </tr>
</table>
<p style="color:#cc0000; text-align:center">* Indicates a required field.</p>
</form>
</div>
<div id="displayDateLast" style="margin-left:5%">
</div>
</body>
</html>

【问题讨论】:

  • @adeneo:或者她决定享受漂亮、干净、无分号的代码。
  • @cookiemonster - 废话,我什至没有考虑过,但可能就是这样。它们看起来确实很丑,我们真的不需要它们
  • @adeneo:我相信我提到这不是我的代码,这是提供给我的代码,我必须检查错误。没有分号不是我的决定。

标签: javascript


【解决方案1】:

我对你的两个函数做了一些改动,其余的函数和html都没问题。它有效,请检查它:-

         function valSaleDownAmt() {
            var saleAmtInput = document.getElementById("SaleAmt"),
            salesAmt=parseInt(saleAmtInput.value,10),

            downPaymentInput = document.getElementById('DownPmt'),
            DownPayment=parseFloat(downPaymentInput.value)/100,
            loanRateInput = document.getElementById('Rate'),
            loanRate=parseFloat(loanRateInput.value),
            loanYearsInput = document.getElementById('Years'),
            loanYears=parseInt(loanYearsInput.value);

            if (isNaN(salesAmt) || (salesAmt <=0)) {
                alert("The sales amount is not a valid number!")
                saleAmtInput.value = ""
                saleAmtInput.focus()
            }
            else if (isNaN(DownPayment) || (DownPayment <= 0) || DownPayment > 100) {
                alert("The Down Payment Rate is not a valid number!")
                downPaymentInput.value = " "
                downPaymentInput.focus()
            } else   if (isNaN(loanRate) || (loanRate <= 0)) {
                alert("The interest rate is not a valid number!")
                loanRateInput.value = ""
                loanRateInput.focus()
            } else  if (isNaN(loanYears) || (loanYears < 1)) {
                alert("Please select a valid number of years from the list!")
            }
            else {
                CalcLoanAmt(salesAmt,DownPayment,loanRate,loanYears); 
            }
        }

        function CalcLoanAmt(salesAmt,DownPayment,loanRate,loanYears) {
            var amtDown = salesAmt*DownPayment,
            loanAmt = salesAmt-amtDown,
            monthlyPmt = monthly(loanAmt,loanRate,loanYears);
            document.getElementById('Payment').value=dollarFormat(monthlyPmt.toString());
            document.getElementById('LoanAmt').value = loanAmt;
        }

也就是说,不需要像这样的全局变量:-

var salesAmt
var loanAmt
var loanRate
var loanYears

您可以删除此变量。

你必须在你的html中修改两个地方:-

一个是:-

     <tr>
         <td align="right">
             <span style="color:#cc0000">*</span> Down Payment as a percent
         </td>
         <td><input name="DownPmt" type="text" id="DownPmt" size="4" /> 
          %</td>
      </tr>

也就是说,你必须删除输入框模糊时的函数调用。

第二个是:-

   <tr>
      <td align="right">
         <input name="button" type="button" value="Calculate" onclick="valSaleDownAmt()" />
       </td>
        <td>
          <input name="Reset" type="reset" />
         </td>
   </tr>

这意味着您必须在点击计算按钮时调用函数 valSaleDownAmt 而不是函数 CalcLoanAmt。

之前代码的功能是一样的,但在某些情况下会引发一些问题,所以我认为它是更合适的代码。试试看。

【讨论】:

  • 啊,那行得通。太感谢了!!!!!!!!我现在可以吻你!你们都是最棒的,谢谢你们的帮助。 :)
  • 给一个人一条鱼,他们吃一天,教一个人钓鱼......哦,没关系。
  • 我确实按照您的建议进行了尝试,但同样,我正在参加介绍课程,几天前才开始学习所有这些内容。当我尝试通过您建议的调试器时,我不知道自己在做什么,无法弄清楚,并且变得更加困惑,甚至更加不知所措。我不只是想完成作业,我也在努力学习所有这些东西。现在我可以比较因陀罗所拥有的和我所拥有的,看看我缺少什么。
  • 我对我的代码做了一些改动,你可以试试。虽然您的问题在上一个答案中得到了解决,但后来我意识到它可能会在某些情况下产生问题。所以,我做了这个改变。
【解决方案2】:

这是一个学习使用调试器单步调试代码的好机会。在计算值的函数中添加几个断点,并对用于计算每月付款的变量设置监视,并确定它们从何处开始返回无效值。你很快就会发现有问题的代码:)

您可以在https://developer.chrome.com/devtools/docs/javascript-debugging 阅读有关 Chrome 调试器的信息。 https://www.youtube.com/watch?v=htZAU7FM7GI 上还有一个不错的介绍视频。

此外,虽然技术上没有要求,但您应该以分号结束您的陈述。如果您不了解 Javascript 的所有各种语句规则,那么省略分号可能会产生意想不到的结果。

【讨论】:

    【解决方案3】:

    我认为比尔有最好的“答案”。但我认为在这个特定的例子中,你已经在 2 个地方定义了 loanAmt (var loanAmt)。

    我认为您不希望将它定义在第二个位置(局部变量)。

    CalcLoadAmount 现在调用Monthly 时,“loadAmt”的值没有定义。我尝试删除第二个变量声明,它可能是您需要的修复....

    function valSaleDownAmt() {
        var salesAmt=parseInt(LoanCalc.SaleAmt.value,10)
        if (isNaN(salesAmt) || (salesAmt <=0)) {
            alert("The sales amount is not a valid number!")
            LoanCalc.SaleAmt.value = ""
            LoanCalc.SaleAmt.focus()
        }
        else {
            var DownPayment=parseFloat(LoanCalc.DownPmt.value)/100
            if (isNaN(DownPayment) || (DownPayment <= 0) || DownPayment > 100) {
               alert("The Down Payment Rate is not a valid number!")
               LoanCalc.DownPmt.value = " "
               LoanCalc.DownPmt.focus()
        }
            else {
                var amtDown = salesAmt*DownPayment
    
                //
                // THIS IS THE LINE I CHANGED RIGHT BELOW THIS COMMENT**
                //
                loanAmt = salesAmt-amtDown
                LoanCalc.LoanAmt.value = dollarFormat(loanAmt.toFixed(2))
                LoanCalc.Rate.focus()
            }
        }
    }
    

    【讨论】:

      【解决方案4】:

      问题与 Brad Parks 提到的 loanAmt 变量有关(它不会让我发表评论)。如果将以下代码添加到 CalcLoanAmt() 的开头,该函数将起作用。尽管可能有更好的方法可以做到这一点,但这段代码会修复它。祝你好运!

      loanAmt=parseInt(LoanCalc.SaleAmt.value,10) - (parseFloat(LoanCalc.DownPmt.value)/100)
      

      【讨论】:

        【解决方案5】:

        我认为问题的出现是因为您的价值观始终未定义。在声明变量的脚本顶部,没有给出默认值。尝试给它们默认值 0。你不应该再得到 undefined 了。这不会完全解决您的问题,但这是一个好的开始。此外,您应该尝试通过将其放在变量之前使变量成为全局变量。所以对于顶部的变量 this.salesAmt = 0 this.loanAmt = 0 this.loanRate = 0 this.loanYears = 0

        并且它们出现在您的代码中的任何地方都将其放在它们之前。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2023-04-05
          • 1970-01-01
          • 1970-01-01
          • 2019-04-01
          • 1970-01-01
          • 2013-06-10
          • 2012-05-31
          相关资源
          最近更新 更多