ipink-util
Version:
util.js
207 lines (205 loc) • 6.43 kB
JavaScript
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 };