console
var tpl = document.querySelector("#tpl");
var div = document.querySelector("#loan");
var table = document.querySelector("table>tbody");
div.append(document.importNode(tpl.content, true));
document.querySelector("#add").addEventListener("click", function (e) {
div.append(document.importNode(tpl.content, true));
});
document.querySelector("#repay").addEventListener("click", function (e) {
var total = document.querySelector("#total").value;
var type = querySelector("[name='type']");
var year = querySelector("[name=year]");
var rate = querySelector("[name=rate]");
var date = querySelector("[name=date]").map(function (t) {
return new Date(t.replace(/-/g, "/"));
});
table.innerHTML = tbody(total, type, year, rate, date);
});
function querySelector(s) {
return Array.prototype.slice.call(document.querySelectorAll(s)).map(function (t) {
return t.value
});
}
function tbody(total, type, year, rate, date) {
this._total = 0;
this._balance = total * 10000;
var t = _balance;
var d = new Date(date[0].getTime());
var m = year[0] * 12;
var _m = m;
var items = new Array();
for (var i = 1; i <= m; i++) {
var k = 0;
for (var j = date.length - 1; j > 0; j--) {
if (date[j].getTime() > d.getTime()) {
continue;
} else if (date[j].getTime() == d.getTime()) {
t = _balance;
_m = year[j] * 12 - i + 1;
k = j;
break;
} else {
k = j;
break;
}
}
m = year[k] * 12;
var fn = eval("this.bill_b" + type[k]);
var args = new Array(t, _m, rate[k] / 1200, d, i);
var b = fn.apply(this, args);
items.push(b);
d.setMonth(d.getMonth() + 1);
}
return items.map(tr => {
var td = tr.map(td => `<td>${td}</td>`).join('');
return `<tr>${td}</tr>`
}).join('');
}
function bill_bj(t, m, r, d, p) {
let interest = _balance * r;
let capital = t / m;
let payment = capital + interest;
let balance = _balance - capital;
_balance = balance;
this._total += interest;
return new Array(p, d.toLocaleDateString(), payment.toFixed(2), this._total.toFixed(2), balance.toFixed(2));
}
function bill_bx(t, m, r, d, p) {
let interest = _balance * r;
let payment = t * r * Math.pow(1 + r, m) / (Math.pow(1 + r, m) - 1);
let capital = payment - interest;
let balance = _balance - capital;
_balance = balance;
this._total += interest;
return new Array(p, d.toLocaleDateString(), payment.toFixed(2), this._total.toFixed(2), balance.toFixed(2));
}
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
<title>贷款账单</title>
<style>
</style>
</head>
<body>
<template id="tpl">
<select name="type"><option value="j">本金</option><option value="x">本息</option></select>
<input name="year" value="30" placeholder="期限,单位年,如30" />
<input name="rate" value="5.85" placeholder="年化率,如5.85" />
<input name="date" value="2022/1/1" type="date" placeholder="日期" />
<br />
</template>
<input id="total" value="150" placeholder="总额,单位万,如150 " />
<button id="add"> + </button> <button id="repay"> 计算 </button><br />
<div id="loan">
</div>
<table>
<thead>
<tr>
<th>期数</th>
<th>日期</th>
<th>每月还款额</th>
<th>累计利息</th>
<th>剩余贷款额</th>
</tr>
</thead>
<tbody></tbody>
</table>
<a href="https://beian.miit.gov.cn/" target="_blank" style="position: fixed;bottom: 0;">粤ICP备20012318号 @plem.cn</a>
</body>
</html>
input {
width: 20%;
}
a {
position: fixed;
bottom: 0;
text-decoration: none;
}
table tbody {
display: block;
height: 450px;
overflow-y: scroll
}
table thead,
tbody tr {
display: table;
width: 100%;
table-layout: fixed;
}
table head {
width: calc( 100% - 1.1em)
}
td,
th {
text-align: center
}