封装js房贷计算器
const formatFloat = function (input, decimals) {
let formatFloatNumb = Math.round(input * Math.pow(10, decimals)) / Math.pow(10, decimals);
return formatFloatNumb.toFixed(decimals);
};
const loanFormula = {
getRepayPerMouPriceAi: function (loanTotal, interestRatePerMou, totalMouths) {
let x = Math.pow((1 + interestRatePerMou), totalMouths);
return (loanTotal * interestRatePerMou * x / (x - 1));
},
getRepayInterestPerMouAi: function (i, loanTotal, interestRatePerMou, totalMouths) {
let [x, y] = [Math.pow((1 + interestRatePerMou), i), Math.pow((1 + interestRatePerMou), totalMouths)];
return (loanTotal * interestRatePerMou * (x - y * (x - 1) / (y - 1)));
}
};
export function calculate(loanTotal, interestRatePerMou, totalMouths) {
let repayPerMouObj = {
repayPerMouObjAi: {
repayInterestPerMouArrAi: [],
repayPrincipalPerMouArrAi: [],
balanceArrAi: [],
totalRepaidArrAi: [],
totalRepayPerMouArrAi: []
},
repayPerMouObjAp: {
repayInterestPerMouArrAp: [],
repayPerMouPriceArrAp: [],
balanceArrAp: [],
totalRepaidArrAp: [],
totalRepayPerMouArrAp: []
}
};
let repayPerMouAi = loanFormula.getRepayPerMouPriceAi(loanTotal, interestRatePerMou, totalMouths);
let balancePerMouAi = loanTotal;
let totalRepaidPerMouAi = 0;
let repayPrincipalPerMouAp = loanTotal / totalMouths;
let decreasePerMouAp = repayPrincipalPerMouAp * interestRatePerMou;
let balancePerMouAp = loanTotal;
let totalRepaidPerMouAp = 0;
const getRepayPerMouObj = function () {
for (let i = 0; i < totalMouths; i++) {
let repayInterestPerMouAi = loanFormula.getRepayInterestPerMouAi(i, loanTotal, interestRatePerMou, totalMouths);
let repayPrincipalPerMouAi = repayPerMouAi - repayInterestPerMouAi;
balancePerMouAi = balancePerMouAi - repayPrincipalPerMouAi;
totalRepaidPerMouAi = totalRepaidPerMouAi + repayPerMouAi;
let totalRepayPerMouAi = balancePerMouAi + totalRepaidPerMouAi;
repayPerMouObj.repayPerMouObjAi.repayInterestPerMouArrAi.push(formatFloat(repayInterestPerMouAi, 4));
repayPerMouObj.repayPerMouObjAi.repayPrincipalPerMouArrAi.push(formatFloat(repayPrincipalPerMouAi, 4));
repayPerMouObj.repayPerMouObjAi.balanceArrAi.push(formatFloat(balancePerMouAi, 4));
repayPerMouObj.repayPerMouObjAi.totalRepaidArrAi.push(formatFloat(totalRepaidPerMouAi, 4));
repayPerMouObj.repayPerMouObjAi.totalRepayPerMouArrAi.push(formatFloat(totalRepayPerMouAi, 4));
let repayInterestPerMouAp = loanTotal * interestRatePerMou * (1 - (i - 0) / totalMouths);
let repayPerMouPriceAp = repayPrincipalPerMouAp + repayInterestPerMouAp;
balancePerMouAp = balancePerMouAp - repayPrincipalPerMouAp;
totalRepaidPerMouAp = totalRepaidPerMouAp + repayPerMouPriceAp;
let totalRepayPerMouAp = balancePerMouAp + totalRepaidPerMouAp;
repayPerMouObj.repayPerMouObjAp.repayInterestPerMouArrAp.push(formatFloat(repayInterestPerMouAp, 4));
repayPerMouObj.repayPerMouObjAp.repayPerMouPriceArrAp.push(formatFloat(repayPerMouPriceAp, 4));
repayPerMouObj.repayPerMouObjAp.balanceArrAp.push(formatFloat(balancePerMouAp, 4));
repayPerMouObj.repayPerMouObjAp.totalRepaidArrAp.push(formatFloat(totalRepaidPerMouAp, 4));
repayPerMouObj.repayPerMouObjAp.totalRepayPerMouArrAp.push(formatFloat(totalRepayPerMouAp, 4));
}
return repayPerMouObj;
};
getRepayPerMouObj();
let totalRepayAi = repayPerMouAi * totalMouths;
let totalInterestAi = totalRepayAi - loanTotal;
const totalRepayPriceAp = repayPerMouObj.repayPerMouObjAp.totalRepaidArrAp[repayPerMouObj.repayPerMouObjAp.totalRepaidArrAp.length - 1];
const totalInterestAp = totalRepayPriceAp - loanTotal;
return {
loanTotal: formatFloat(loanTotal, 0),
totalInterestAi: formatFloat(totalInterestAi, 2),
totalRepayAi: formatFloat(totalRepayAi, 0),
repayPerMouAi: formatFloat(repayPerMouAi, 2),
totalInterestAp: formatFloat(totalInterestAp, 2),
totalRepayPriceAp: formatFloat(totalRepayPriceAp, 2),
repayPrincipalPerMouAp: formatFloat(repayPrincipalPerMouAp, 2),
repayPerMouthAp: formatFloat(repayPerMouObj.repayPerMouObjAp.repayPerMouPriceArrAp[0], 2),
decreasePerMouAp: formatFloat(decreasePerMouAp, 2),
repayPerMouObjAi: repayPerMouObj.repayPerMouObjAi,
repayPerMouObjAp: repayPerMouObj.repayPerMouObjAp
}
};