/* 教育ローンシュミレータ */ /* 本ロジックには浮動小数点誤差が考慮されていないため */ /** * 与えられた値の小数点以下の桁数を返す * multiply, subtractで使用 * * 例) * 10.12 => 2 * 99.999 => 3 * 33.100 => 1 */ function _getDecimalLength(value) { var list = (value + '').split('.'), result = 0; if (list[1] !== undefined && list[1].length > 0) { result = list[1].length; } return result; }; /** * 乗算処理 * * value1, value2から小数点を取り除き、整数値のみで乗算を行う。 * その後、小数点の桁数Nの数だけ10^Nで除算する */ function multiply(value1, value2) { var intValue1 = +(value1 + '').replace('.', ''), intValue2 = +(value2 + '').replace('.', ''), decimalLength = _getDecimalLength(value1) + _getDecimalLength(value2), result; result = (intValue1 * intValue2) / Math.pow(10, decimalLength); return result; }; /** * 減算処理 * * value1,value2を整数値に変換して減算 * その後、小数点の桁数分だけ小数点位置を戻す */ function subtract(value1, value2) { var max = Math.max(_getDecimalLength(value1), _getDecimalLength(value2)), k = Math.pow(10, max); return (multiply(value1, k) - multiply(value2, k)) / k; }; /* 本ロジックには浮動小数点誤差が考慮されていないため ここまで追加 */ var riritu; var hosyo_data; $('#rito').change(function(){ if ($(this).is(':checked')) { $('#shingaku').prop('checked', false); $('#shingaku').prop('disabled', true); $('#shingaku_box').addClass('color_hide'); $('#shingaku_p').addClass("tokurei_disable"); } else { if (!$('#boshi').is(':checked')) { $('#shingaku').prop('disabled', false); $('#shingaku_box').removeClass("color_hide"); $('#shingaku_p').removeClass("tokurei_disable"); } } }); $('#boshi').change(function(){ if ($(this).is(':checked')) { $('#shingaku').prop('checked', false); $('#shingaku').prop('disabled', true); $('#shingaku_box').addClass('color_hide'); $('#shingaku_p').addClass("tokurei_disable"); } else { if (!$('#rito').is(':checked')) { $('#shingaku').prop('disabled', false); $('#shingaku_box').removeClass("color_hide"); $('#shingaku_p').removeClass("tokurei_disable"); } } }); $('#shingaku').change(function(){ if ($(this).is(':checked')) { $('#rito').prop('checked', false); $('#boshi').prop('checked', false); $('#rito').prop('disabled', true); $('#boshi').prop('disabled', true); $('#rito_box, #boshi_box').addClass('color_hide'); $('#rito_p').addClass("tokurei_disable"); $('#boshi_p').addClass("tokurei_disable"); } else { $('#rito').prop('disabled', false); $('#boshi').prop('disabled', false); $('#rito_box, #boshi_box').removeClass("color_hide"); $('#rito_p').removeClass("tokurei_disable"); $('#boshi_p').removeClass("tokurei_disable"); } }); $(function(){ $.get("/js/data/kinri.dat", function(data){ riritu = data; }); $.get("/js/data/hosyo.dat", function(data){ hosyo_data = data.split(/\r\n|\r|\n/); console.log(hosyo_data); }); $("#btn_calc").click(function(){ calc_simulation(); }); }); function calc_simulation(){ var err_txt = ""; var msg = ""; var kingaku = $("#kingaku").val(); $("#sec_error").hide(); if(kingaku == ""){ msg = "お借入れ希望金額を入力してください。"; err_txt += "
  • " + msg + "
  • "; $("#kingaku_err").text(msg).show(); }else if(kingaku < 1 || 450 < kingaku){ /* 最低金額を変更@2020.05.01 */ msg = "1万円以上450万円以下の金額をご入力ください。"; // msg = "10万円以上450万円以下の金額をご入力ください。"; err_txt += "
  • " + msg + "
  • "; $("#kingaku_err").text(msg).show(); }else{ $("#kingaku_err").hide(); } var kikan_y = $("#select1").val(); var kikan_m = $("#select2").val(); if(kikan_y == 0 && kikan_m == 0){ msg = "返済期間を入力してください。"; err_txt += "
  • " + msg + "
  • "; $("#kikan_err").text(msg).show(); }else if(kikan_y == 0 && kikan_m < 6){ msg = "6ヵ月以上の期間となるよう入力してください。"; err_txt += "
  • " + msg + "
  • "; $("#kikan_err").text(msg).show(); }else{ $("#kikan_err").hide(); } var hensai_kaisu = (kikan_y * 12) + Number(kikan_m); // 月数 var sueoki_kaisu = 0; var sueoki_y = 0; var sueoki_m = 0; var hensai_y = 0; var hensai_m = 0; // 母子家庭、交通遺児家庭、または世帯年収200万円以内(所得122万円以内)の方は18年以内。 // 進学利率特例追加 2016/03/04 by santiago. if ( $('#boshi').is(':checked') || $('input[name=hosyo]:checked').val() == "two_thirds" || $('#shingaku').is(':checked') || $('#rito').is(':checked') ) { if((kikan_y == 20 && 0 < kikan_m) || (20 < kikan_y)){ msg = "20年0ヵ月以内の期間を入力してください。"; err_txt += "
  • " + msg + "
  • "; $("#kikan_err").text(msg).show(); } }else{ if((kikan_y == 20 && 0 < kikan_m) || (20 < kikan_y)){ msg = "20年0ヵ月以内の期間を入力してください。"; err_txt += "
  • " + msg + "
  • "; $("#kikan_err").text(msg).show(); } } sueoki_y = $("#select4").val(); sueoki_m = $("#select5").val(); sueoki_kaisu = (sueoki_y * 12) + Number(sueoki_m); // 月数 if (sueoki_kaisu != 0){ if(hensai_kaisu <= sueoki_kaisu){ msg = "返済期間より短い期間を入力してください。"; err_txt += "
  • " + msg + "
  • "; $("#pay_err").text(msg).show(); /*** }else if(sueoki_kaisu < 1){ msg = "1ヵ月以上の期間を入力してください。"; err_txt += "
  • " + msg + "
  • "; $("#pay_err").text(msg).show(); ***/ }else{ $("#pay_err").text(msg).hide(); } } if(err_txt != ""){ $("#sec_error").show(); $("#error_mes").html(""); $("html,body").animate({scrollTop:0}, 100); return false; } var riritu_y = get_nenri(); var riritu_m = riritu_y / 1200; // 月利 百分率の数値化 var sueoki_gaku = 0; // 元金据置中のご返済額 var hensai_gaku = 0; // 毎月のご返済額 var year_gaku = 0; // 1年間の返済額 var total_gaku = 0; // ご返済総額 var bonus_gaku = 0; // ボーナス月加算 var bonus_kaisu = 0; // ボーナス回数 var bonus_kasan = 0; // ボーナス回加算額 var kingaku_b = 0; // 借入金額 - ボーナス月支払額 var bonus_kingaku = 0; // ボーナス加算分 // 離島利率特例は、2契約に按分するので、そのための処理。 var kingaku_a = []; var riritu_y_a = []; var riritu_m_a = []; var hensai_kaisu_a = [0, 0]; var sueoki_gaku_a = [0, 0]; var hensai_gaku_a = [0, 0]; var year_gaku_a = [0, 0]; var total_gaku_a = [0, 0]; var bonus_gaku_a = [0, 0]; var bonus_kaisu_a = [0, 0]; var bonus_kasan_a = [0, 0]; var kingaku_b_a = [0, 0]; var bonus_kingaku_a = [0, 0]; var keiyaku_su = 1; // 離島利率特例は、150万円を超えると、2契約に按分する // 進学利率特例追加 2016/03/04 by santiago. var tokureiGaku = 150; if ( $('#rito').is(':checked') || $('#shingaku').is(':checked') ) { if (kingaku > tokureiGaku) { keiyaku_su = 2; kingaku_a[0] = tokureiGaku; kingaku_a[1] = kingaku - tokureiGaku; riritu_y_a[0] = Math.round((Number(riritu_y) - 0.9) * 100) / 100; // 特例利率 丸め riritu_y_a[1] = riritu_y; riritu_m_a[0] = riritu_y_a[0] / 1200; // 月利 百分率の数値化 riritu_m_a[1] = riritu_y_a[1] / 1200; hensai_kaisu_a[0] = hensai_kaisu; hensai_kaisu_a[1] = hensai_kaisu; // 2 契約に按分 if($("#bonus_ritsu").val() != ""){ // ボーナス月返済増額あり // bonus_kingaku_a[0] = Math.round(Number($("#bonus_zougaku").val()) * (kingaku_a[0] / kingaku)); // bonus_kingaku_a[1] = Number($("#bonus_zougaku").val()) - bonus_kingaku_a[0]; bonus_kingaku_a[0] = kingaku_a[0] * $("#bonus_ritsu").val() / 100; // 百分率の数値化 bonus_kingaku_a[1] = kingaku_a[1] * $("#bonus_ritsu").val() / 100; // alert("ぼ増" + Number($("#bonus_zougaku").val()) + "を" + bonus_kingaku_a[0] + "と" + bonus_kingaku_a[1]); } } else { // 1 契約 keiyaku_su = 1; kingaku_a[0] = kingaku; riritu_y_a[0] = Math.round((Number(riritu_y) - 0.9) * 100) / 100; // 特例利率 丸め riritu_m_a[0] = riritu_y_a[0] / 1200; // 月利 百分率の数値化 hensai_kaisu_a[0] = hensai_kaisu; if($("#bonus_ritsu").val() != ""){ // ボーナス月返済増額あり // bonus_kingaku_a[0] = Number($("#bonus_zougaku").val()); bonus_kingaku_a[0] = kingaku_a[0] * $("#bonus_ritsu").val() / 100; // 百分率の数値化 } } } else { // 通常計算 keiyaku_su = 1; kingaku_a[0] = kingaku; riritu_y_a[0] = riritu_y; riritu_m_a[0] = riritu_y_a[0] / 1200; // 月利 百分率の数値化 hensai_kaisu_a[0] = hensai_kaisu; if($("#bonus_ritsu").val() != ""){ // ボーナス月返済増額あり // bonus_kingaku_a[0] = Number($("#bonus_zougaku").val()); bonus_kingaku_a[0] = kingaku_a[0] * $("#bonus_ritsu").val() / 100; // 百分率の数値化 } } for (var i = 0; i < keiyaku_su; i++){ // 元金据置中のご返済額 if (sueoki_kaisu != 0){ // 利息のみお支払期間 sueoki_gaku_a[i] = Math.floor(kingaku_a[i] * riritu_m_a[i] * 10000); // 10000 は、万円の数値化 hensai_kaisu_a[i] -= sueoki_kaisu; } hensai_y = Math.floor(hensai_kaisu_a[i] / 12); // 年数 hensai_m = hensai_kaisu_a[i] % 12; // 月数 bonus_kaisu_a[i] = Math.floor(((hensai_kaisu_a[i] - 3) / 6) + Number(1)); if($("#bonus_ritsu").val() != ""){ // ボーナス月返済増額あり // bonus_kingaku_a[i] = kingaku_a[i] * $("#select3").val() / 100; // 百分率の数値化 bonus_kasan_a[i] = bonus_kingaku_a[i] * 10000 * ((Math.pow(Number(riritu_m_a[i]) + Number(1), (bonus_kaisu_a[i] * 6) + Number(3)) - Math.pow(Number(riritu_m_a[i]) + Number(1), (bonus_kaisu_a[i] * 6) - Number(3))) / (Math.pow(Number(riritu_m_a[i]) + Number(1), (6 * bonus_kaisu_a[i])) - Number(1))); // 10000 は、万円の数値化 bonus_kasan_a[i] = Math.floor(bonus_kasan_a[i]); } kingaku_b_a[i] = kingaku_a[i] - bonus_kingaku_a[i]; // 2015/12/03 顧客要望にて日本公庫の修正点反映 by santiago. // 1年間のご返済額 据置措置なしの場合返済回数 - 1 if (sueoki_kaisu != 0){ hensai_gaku_a[i] = kingaku_b_a[i] * 10000 * (riritu_m_a[i] / (Number(1) - Number(Math.pow(Number(riritu_m_a[i]) + Number(1), 0 - Number(hensai_kaisu_a[i]))))); // 10000 は、万円の数値化 } else { hensai_gaku_a[i] = kingaku_b_a[i] * 10000 * (riritu_m_a[i] / (Number(1) - Number(Math.pow(Number(riritu_m_a[i]) + Number(1), 0 - (Number(hensai_kaisu_a[i]) - Number(1)))))); // 10000 は、万円の数値化 } hensai_gaku_a[i] = Math.floor(hensai_gaku_a[i]); if(0 < bonus_kasan_a[i]){ bonus_gaku_a[i] = Number(hensai_gaku_a[i]) + Number(bonus_kasan_a[i]); bonus_gaku_a[i] = Math.floor(bonus_gaku_a[i]); year_gaku_a[i] = (hensai_gaku_a[i] * 12) + Number(bonus_kasan_a[i] * 2); // 1年分 }else{ year_gaku_a[i] = hensai_gaku_a[i] * 12; // 1年分 } // 2015/12/03 顧客要望にて日本公庫の修正点反映 by santiago. // 1年間のご返済額 据置措置なしの場合返済回数 - 1 if (sueoki_kaisu != 0){ total_gaku_a[i] = Number(hensai_gaku_a[i] * hensai_kaisu_a[i]) + Number(sueoki_gaku_a[i] * sueoki_kaisu) + Number(bonus_kasan_a[i] * bonus_kaisu_a[i]); } else { total_gaku_a[i] = Number(hensai_gaku_a[i] * (hensai_kaisu_a[i] - Number(1))) + Number(sueoki_gaku_a[i] * sueoki_kaisu) + Number(bonus_kasan_a[i] * bonus_kaisu_a[i]); } } // 2契約分を合算する。 var sueoki_gaku = sueoki_gaku_a[0] + sueoki_gaku_a[1]; var hensai_gaku = hensai_gaku_a[0] + hensai_gaku_a[1]; var year_gaku = year_gaku_a[0] + year_gaku_a[1]; var total_gaku = total_gaku_a[0] + total_gaku_a[1]; var bonus_gaku = bonus_gaku_a[0] + bonus_gaku_a[1]; // ボーナス回数は、それぞれの契約での回数なので、合算しない。 var bonus_kaisu = bonus_kaisu_a[0]; var bonus_kasan = bonus_kasan_a[0] + bonus_kasan_a[1]; var kingaku_b = kingaku_b_a[0] + kingaku_b_a[1]; var bonus_kingaku = bonus_kingaku_a[0] + bonus_kingaku_a[1]; /*** alert( "元金据置中のご返済額 " + sueoki_gaku + " を " + sueoki_gaku_a[0] + " と " + sueoki_gaku_a[1] + " に " + "\n" + "毎月のご返済額 " + hensai_gaku + " を " + hensai_gaku_a[0] + " と " + hensai_gaku_a[1] + " に " + "\n" + "1年間の返済額 " + year_gaku + " を " + year_gaku_a[0] + " と " + year_gaku_a[1] + " に " + "\n" + "ご返済総額 " + total_gaku + " を " + total_gaku_a[0] + " と " + total_gaku_a[1] + " に " + "\n" + "ボーナス月加算 " + bonus_gaku + " を " + bonus_gaku_a[0] + " と " + bonus_gaku_a[1] + " に " + "\n" + "ボーナス回数 " + bonus_kaisu + "\n" + "ボーナス回加算額 " + bonus_kasan + " を " + bonus_kasan_a[0] + " と " + bonus_kasan_a[1] + " に " + "\n" + "借入金額 - ボーナス月支払額 " + kingaku_b + " を " + kingaku_b_a[0] + " と " + kingaku_b_a[1] + " に " + "\n" + "ボーナス加算分 " + bonus_kingaku + " を " + bonus_kingaku_a[0] + " と " + bonus_kingaku_a[1] + " に "); ***/ // 保証料総額 // var hosyo_gaku = Math.floor(kingaku * 10000 * get_hosyo()); // 10000 は、万円の数値化 var hosyo_gaku = 0; if ($('input[name=hosyo]:checked').val() != "no") { // hosyo_gaku = Math.floor(kingaku * 10000 * get_hosyo()); // 10000 は、万円の数値化 // 小数点以下は切り捨て hosyo_gaku = Math.floor(multiply(kingaku + "0000", get_hosyo())); // 浮動小数点誤差対応版 } if (sueoki_kaisu != 0){ // 利息のみお支払期間 var hosyo_kikan = (sueoki_y * 12) + Number(sueoki_m); // 月数 if(23 < hosyo_kikan && hosyo_kikan <= 35){ hosyo_gaku = Math.floor(hosyo_gaku * 1.2); }else if(35 < hosyo_kikan && hosyo_kikan <= 47){ hosyo_gaku = Math.floor(hosyo_gaku * 1.3); }else if(47 < hosyo_kikan && hosyo_kikan <= 59){ hosyo_gaku = Math.floor(hosyo_gaku * 1.4); }else if(59 < hosyo_kikan && hosyo_kikan <= 71){ hosyo_gaku = Math.floor(hosyo_gaku * 1.5); }else if(71 < hosyo_kikan && hosyo_kikan <= 216){ hosyo_gaku = Math.floor(hosyo_gaku * 1.6); } } if ($('input[name=hosyo]:checked').val() == "two_thirds") { hosyo_gaku = Math.floor(hosyo_gaku * 2 / 3); } // $("#nen_kinri").text(riritu_y_a[0]); // $("#sueoki_y").text(sueoki_y); // $("#sueoki_m").text(sueoki_m); $("#sueoki_kaisu").text(sueoki_kaisu); $("#sueoki_gaku").text(add_comma(hasu_keisan(sueoki_gaku))); // $("#hensai_y").text(hensai_y); // $("#hensai_m").text(hensai_m); if (bonus_gaku > 0) { if (sueoki_kaisu == 0){ // 据え置き回数が 0 の場合は、返済回数を -1 する、顧客要望 by santiago. $("#hensai_kaisu").text(hensai_kaisu_a[0] - bonus_kaisu - 1); //毎月の返済回数 - ボーナス回数 } else { $("#hensai_kaisu").text(hensai_kaisu_a[0] - bonus_kaisu); //毎月の返済回数 - ボーナス回数 } } else { if (sueoki_kaisu == 0){ // 据え置き回数が 0 の場合は、返済回数を -1 する、顧客要望 by santiago. $("#hensai_kaisu").text(hensai_kaisu_a[0] - 1); //毎月の返済回数 } else { $("#hensai_kaisu").text(hensai_kaisu_a[0]); //毎月の返済回数 } } $("#hensai_gaku").text(add_comma(hasu_keisan(hensai_gaku))); if (bonus_gaku > 0) { $("#bonus_kaisu").text(bonus_kaisu); $("#bonus_gaku").text(add_comma(hasu_keisan(bonus_gaku))); } else { $("#bonus_kaisu").text("0"); $("#bonus_gaku").text(add_comma(hasu_keisan(bonus_gaku))); } if(hensai_y < 1){ $("#year_gaku").closest("tr").hide(); }else{ $("#year_gaku").closest("tr").show(); $("#year_gaku").text(add_comma(hasu_keisan(year_gaku))); } $("#total_gaku").text(add_comma(hasu_keisan(total_gaku))); $("#hosyo_gaku").text(add_comma(hosyo_gaku)); $("#sec_error").hide(); return false; } function add_comma(val){ var num = new String(val).replace(/,/g, ""); while(num != (num = num.replace(/^(-?\d+)(\d{3})/, "$1,$2"))); return num; } function hasu_keisan(val){ return Math.ceil(Math.floor(val) / 100) * 100; // 丸め } // 百分率 // 進学利率特例追加 2016/03/04 by santiago. function get_nenri(){ if ( $('#boshi').is(':checked') || $('#shingaku').is(':checked') ) { // 母子家庭 OR 世帯年収(所得)200万円(122万円)以内 return Math.round((Number(riritu) - 0.4) * 100) / 100; // 丸め }else{ return riritu; } } function get_hosyo(){ var rate = 0; var kaisu = ($("#select1").val() * 12) + Number($("#select2").val()); for(var i = 0; i < hosyo_data.length; i++){ var hosyo = hosyo_data[i].split(','); if(hosyo[0] == kaisu){ rate = hosyo[1]; break; } } return rate; }