Skip to content

Instantly share code, notes, and snippets.

@taizawa
Last active October 25, 2022 01:51
Show Gist options
  • Save taizawa/5da86593c38cd267ade89340e21db101 to your computer and use it in GitHub Desktop.
Save taizawa/5da86593c38cd267ade89340e21db101 to your computer and use it in GitHub Desktop.
ローン計算(ExcelのPMT関数を再現)
<html>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script>
<body>
<form method="post">
<p>返済回数: <input type="text" name="loan_term" value="36" /></p>
<p>年利: <input type="text" name="interest_rate" value="2.3" /></p>
<p>借入額: <input type="text" name="loan_amount" value="1000000" /></p>
<p>ボーナス払い: <input type="text" name="bonus" value="300000" /></p>
<p>ボーナス回数(一年に何回か?): <input type="text" name="bonus_count" value="2" /></p>
<p><input type="submit" value="計算" /></p>
<script>
// ExcelのPMT関数を再現
// 金利、返済回数、借入額を指定して、毎月の返済額を計算する
const CALC_PMT = (rate, nper, pv, fv, type) => {
let pmt, pvif;
fv || (fv = 0);
type || (type = 0);
if (rate === 0)
return -(pv + fv) / nper;
pvif = Math.pow(1 + rate, nper);
pmt = - rate * (pv * pvif + fv) / (pvif - 1);
if (type === 1)
pmt /= (1 + rate);
return pmt;
}
const CALC_LOAN = () => {
const loan_term = Number($('input[name=loan_term]').val());
const interest_rate = Number($('input[name=interest_rate]').val());
const loan_amount = Number($('input[name=loan_amount]').val());
const bonus = Number($('input[name=bonus]').val());
return CALC_PMT(interest_rate/100/12, loan_term, loan_amount-(bonus), 0, 0);
}
const CALC_BONUS = () => {
const loan_term = Number($('input[name=loan_term]').val());
const interest_rate = Number($('input[name=interest_rate]').val());
const loan_amount = Number($('input[name=loan_amount]').val());
const bonus = Number($('input[name=bonus]').val());
const bonus_count = Number($('input[name=bonus_count]').val());
return CALC_PMT(interest_rate/100/bonus_count, loan_term/12*bonus_count, bonus, 0, 0);
}
$('input[type=submit]').click((e) => {
e.preventDefault();
const loan_term = Number($('input[name=loan_term]').val());
const interest_rate = Number($('input[name=interest_rate]').val());
const loan_amount = Number($('input[name=loan_amount]').val());
const bonus = Number($('input[name=bonus]').val());
const bonus_count = Number($('input[name=bonus_count]').val());
// 毎月の返済額
const monthly_payment = Math.floor(Math.abs(CALC_LOAN()));
// ボーナス時の加算額
const bonus_payment = bonus_count && bonus ? Math.floor(Math.abs(CALC_BONUS())) : 0;
// 総支払額
const total_payment = bonus_count && bonus ?
Math.floor(monthly_payment * loan_term + bonus_payment * loan_term/12*bonus_count)
: Math.floor(monthly_payment * loan_term);
$('body').append('<p>毎月の返済額: ' + monthly_payment + '</p>');
$('body').append('<p>ボーナス時の加算額: ' + bonus_payment + '</p>');
$('body').append('<p>総支払額: ' + total_payment + '</p>');
return false;
});
</script>
</form>
</body>
</html>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment