UNPKG

ipink-util

Version:

util.js

207 lines (205 loc) 6.43 kB
class Loan { static instance = null; static getInstance() { if (!Loan.instance) { Loan.instance = new Loan(); } return Loan.instance; } constructor() { } /** * @desc 先息后本 * @param options { LoanOptionType } * @return: { LoanResultType } */ xxhb(options) { let { dayRate = 0, yearRate, amount = 0, months = 1 } = options; if (!dayRate && !yearRate) { console.warn("日利率或者年化利率不能为空"); return {}; } if (!yearRate) yearRate = dayRate * 365; let objArray = new Array(); let interestM = 0; let interestTotal = 0; let capital = 0; let totalInterest = amount * yearRate / 12 * 0.01 * months; for (let i = 1; i <= months; i++) { let t1 = totalInterest / months; interestM = t1; if (i == months) { capital = amount; interestM = t1 + amount; } objArray[i - 1] = { num: i, total: interestM.toFixed(2), interest: (interestM - capital).toFixed(2), capital: capital.toFixed(2), remainingLoan: (amount - capital * i).toFixed(2) }; interestTotal = interestTotal + interestM; } interestTotal = Math.round(interestTotal * 100) / 100; let monthly = objArray[0]["total"]; let totalRepayment = "" + interestTotal; let resArray = { "plan": objArray, "info": { monthly: parseFloat(monthly).toFixed(0), totalRepayment: parseFloat(totalRepayment).toFixed(0), totalInterest: parseFloat("" + totalInterest).toFixed(0) } }; return resArray; } /** * @desc 等本等金 * @param options { LoanOptionType } * @return: { LoanResultType } */ dbdx(options) { let { dayRate = 0, yearRate, amount = 0, months = 1 } = options; if (!dayRate && !yearRate) { console.warn("日利率或者年化利率不能为空"); return {}; } if (!yearRate) yearRate = dayRate * 365; let objArray = new Array(); let interestM = 0; let interestTotal = 0; let capital = amount / months; let totalInterest = amount * yearRate / 12 * 0.01 * months; for (let i = 1; i <= months; i++) { let t1 = totalInterest / months; interestM = capital + t1; objArray[i - 1] = { num: i, total: interestM.toFixed(2), interest: (interestM - capital).toFixed(2), capital: capital.toFixed(2), remainingLoan: (amount - capital * i).toFixed(2) }; interestTotal = interestTotal + interestM; } interestTotal = Math.round(interestTotal * 100) / 100; let monthly = objArray[0]["total"]; let totalRepayment = "" + interestTotal; let resArray = { "plan": objArray, "info": { monthly: parseFloat(monthly).toFixed(0), totalRepayment: parseFloat(totalRepayment).toFixed(0), totalInterest: parseFloat("" + totalInterest).toFixed(0) } }; return resArray; } /** * @desc 等额本金 * @param options { LoanOptionType } * @return: { LoanResultType } */ debj(options) { let { dayRate = 0, yearRate, amount = 0, months = 1 } = options; if (!dayRate && !yearRate) { console.warn("日利率或者年化利率不能为空"); return {}; } if (!yearRate) yearRate = dayRate * 365; let active = yearRate * 10 / 12 * 1e-3; let objArray = new Array(); let interestM = 0; let interestTotal = 0; let capital = amount / months; for (let i = 1; i <= months; i++) { let t1 = (amount - amount * (i - 1) / months) * active; interestM = amount / months + t1; objArray[i - 1] = { num: i, total: interestM.toFixed(2), interest: (interestM - capital).toFixed(2), capital: capital.toFixed(2), remainingLoan: (amount - capital * i).toFixed(2) }; if (+(objArray[i - 1]["remainingLoan"] || 0) <= 1) { objArray[i - 1]["remainingLoan"] = 0; } interestTotal = interestTotal + interestM; } interestTotal = Math.round(interestTotal * 100) / 100; let monthly = objArray[0]["total"]; let totalRepayment = interestTotal; let totalInterest = totalRepayment - amount; let resArray = { plan: objArray, info: { monthly: parseFloat(monthly).toFixed(0), totalRepayment: parseFloat("" + totalRepayment).toFixed(0), totalInterest: parseFloat("" + totalInterest).toFixed(0) } }; return resArray; } /** * @desc 等额本息 * @param options { LoanOptionType } * @return: { LoanResultType } */ debx(options) { let { dayRate = 0, yearRate, amount = 0, months = 1 } = options; if (!dayRate && !yearRate) { console.warn("日利率或者年化利率不能为空"); return {}; } if (!yearRate) yearRate = dayRate * 365; let active = yearRate * 10 / 12 * 1e-3; let t1 = Math.pow(1 + active, months); let t2 = t1 - 1; let tmp = t1 / t2; let monthsratio = active * tmp; let monthsBack = (amount * monthsratio).toFixed(2); yearRate = yearRate * 0.01; let yue_lilv = yearRate / 12; let objArray = new Array(); let ljch_bj = 0; let pre_remainingLoan = 0; let i = 1; for (i = 1; i <= months; i++) { objArray[i - 1] = { num: i, total: monthsBack, interest: 0, remainingLoan: 0 }; if (i == 1) { pre_remainingLoan = amount; } else { pre_remainingLoan = +(objArray[i - 2]["remainingLoan"] || 0); } objArray[i - 1]["interest"] = (pre_remainingLoan * yue_lilv).toFixed(2); let capital = +objArray[i - 1]["total"] - +objArray[i - 1]["interest"]; objArray[i - 1]["capital"] = capital.toFixed(2); ljch_bj += capital; let remainingLoan = amount - ljch_bj; objArray[i - 1]["remainingLoan"] = remainingLoan.toFixed(2); if (remainingLoan <= 1) { objArray[i - 1]["remainingLoan"] = 0; } } let monthly = monthsBack; let totalRepayment = +monthsBack * months; let totalInterest = totalRepayment - amount; let resArray = { plan: objArray, info: { monthly: parseFloat(monthly).toFixed(0), totalRepayment: parseFloat("" + totalRepayment).toFixed(0), totalInterest: parseFloat("" + totalInterest).toFixed(0) } }; return resArray; } } export { Loan };