为什么我的抵押贷款计算器显示的小数点位置不正确?

Why is my mortgage calculator showing incorrect decimal placement?

我正在研究一个计算器,到目前为止一切顺利,只是它把小数点放在了错误的位置,从而导致我的舍入函数给出了错误的数字。代码和示例如下:

$(function() {
  // Create USD currency formatter.
  var formatter = new Intl.NumberFormat('en-US', {
    style: 'currency',
    currency: 'USD',
    minimumFractionDigits: 2,
  });

  function calculateAI() {
    var tax = parseFloat(('2,000').replace(/$|,/g, ''));
    var hoa = parseFloat(('200').replace(/$|,/g, ''));
    var cable = parseFloat(('30,000').replace(/$|,/g, ''));
    var util = parseFloat(('44').replace(/$|,/g, ''));
    var other = parseFloat(('0').replace(/$|,/g, ''));
    var price = parseFloat(('200,000').replace(/$|,/g, ''));
    var years = parseFloat(('30').replace(/$|,/g, ''));
    var percent = parseFloat(('10').replace(/$|,/g, ''));
    var yearp = parseFloat(('3.5').replace(/$|,/g, ''));

    var deposit = (percent / 100) * price;
    var loan = price - deposit;
    var interest = (yearp / 100) / 12;
    var months = years * 12;

    var mtotal = loan * interest * (Math.pow(1 + interest, months)) / (Math.pow(1 + interest, months) - 1) || 0;
    var mortamount = mtotal;

    var ai_total = tax + hoa + cable + util + other + mortamount;

    document.getElementById('1870').innerHTML = formatter.format(ai_total);
    document.getElementById('1870-mort').innerHTML = mortamount;
  }
  calculateAI();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="1870-mort"></div>
<div id="1870" style="margin-top: 3px;"></div>

计算器正在给出 --

808.2804380558849

但应该是 --

80.82804380558849

所以我可以将它四舍五入为“81”然后继续我的计算。

我做错了什么?

下面的代码片段中添加了一些控制台日志记录。这将输出以下内容:

tax = 2000, hoa = 200, cable = 30000, util = 44, other = 0, price = 200000, years = 30,
       percent = 10, yearp = 3.5, loan = 180000, deposit = 20000, months = 360, 
       interest = 0.002916666666666667
mtotal = loan * interest * (Math.pow(1 + interest, months))
                         / (Math.pow(1 + interest, months) - 1)
       = 180000 * 0.002916666666666667 * (1.0029166666666667 ^ 360)
                                       / ((1.0029166666666667 ^ 360) - 1)
       = 180000 * 0.002916666666666667 * 2.853287165195746
                                       / 1.8532871651957459
       = 808.2804380558849

将相同的数字代入 https://www.desmos.com/scientific 得到相同的结果。这里的 Javascript 似乎没有任何明显的错误(例如,由于舍入错误、数字解析、类型转换等)所以我怀疑是公式本身。

$(function() {
  // Create USD currency formatter.
  var formatter = new Intl.NumberFormat('en-US', {
    style: 'currency',
    currency: 'USD',
    minimumFractionDigits: 2,
  });

  function calculateAI() {
    var tax = parseFloat(('2,000').replace(/$|,/g, ''));
    var hoa = parseFloat(('200').replace(/$|,/g, ''));
    var cable = parseFloat(('30,000').replace(/$|,/g, ''));
    var util = parseFloat(('44').replace(/$|,/g, ''));
    var other = parseFloat(('0').replace(/$|,/g, ''));
    var price = parseFloat(('200,000').replace(/$|,/g, ''));
    var years = parseFloat(('30').replace(/$|,/g, ''));
    var percent = parseFloat(('10').replace(/$|,/g, ''));
    var yearp = parseFloat(('3.5').replace(/$|,/g, ''));
    var deposit = (percent / 100) * price;
    var loan = price - deposit;
    var interest = (yearp / 100) / 12;
    var months = years * 12;

    var mtotal = loan * interest * (Math.pow(1 + interest, months)) / (Math.pow(1 + interest, months) - 1) || 0;
    console.log('tax = ' + tax + ', hoa = ' + hoa + ', cable = ' + cable + ', util = ' + util + ', other = ' + other + ', price = ' + price + ', years = ' + years + ', percent = ' + percent + ', yearp = ' + yearp + ', loan = ' + loan + ', deposit = ' + deposit + ', months = ' + months + ', interest = ' + interest
       + '\n' + 'mtotal = loan * interest * (Math.pow(1 + interest, months)) / (Math.pow(1 + interest, months) - 1)'
       + '\n' + '       = ' + loan + ' * ' + interest + ' * (' + (1 + interest) + ' ^ ' + months + ') / ((' + (1 + interest) + ' ^ ' + months + ') - 1)'
       + '\n' + '       = ' + loan + ' * ' + interest + ' * ' + (Math.pow(1 + interest, months)) + ' / ' + (Math.pow(1 + interest, months) - 1)
       + '\n' + '       = ' + mtotal);

    var mortamount = mtotal;
    var ai_total = tax + hoa + cable + util + other + mortamount;
  }
  calculateAI();
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="1870-mort"></div>
<div id="1870" style="margin-top: 3px;"></div>

让我们快速检查一下。我们有一笔 180,000 的贷款,需要在 30 年或(360 个月)的期限内每月偿还。忽略任何利息累积,每月最低还款额为

180,000 / 360 = 500

这强烈表明每月 808.28 美元的数字是正确的,而 80.82 美元的数字永远不足以偿还贷款。

我想通了,这是我在 post 页面上的代码中的错字,导致数字不同。事实上,我的公式确实有效。尽管我的问题是因为我的错误,但希望人们能找到我 post 编写的有用代码。