Last active
October 25, 2022 01:51
-
-
Save taizawa/5da86593c38cd267ade89340e21db101 to your computer and use it in GitHub Desktop.
ローン計算(ExcelのPMT関数を再現)
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<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