为什么我的抵押贷款计算器显示的小数点位置不正确?
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 编写的有用代码。
我正在研究一个计算器,到目前为止一切顺利,只是它把小数点放在了错误的位置,从而导致我的舍入函数给出了错误的数字。代码和示例如下:
$(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 编写的有用代码。