我一直在为混合移动应用程序实现EMI计算器,并且在其中一个循环中,执行时间过长,最终页面无响应。这是我的代码
var EMICalculator = {
basicEMI: function (amount, rate, tenure) {
// body...
var rate_yearly = parseFloat((rate/12)/100);
var amt = parseFloat(amount*rate_yearly*Math.pow((rate_yearly+1),tenure)/(Math.pow((rate_yearly+1),tenure)-1));
return amt.toFixed(2);
},
getBalanceClassic: function (amount, rate, tenure, emi, openingBal, toReturn){
var interest_per_month = 0.0;
var schedule = [];
for(var i=1; i<=tenure; i++){
var dataJson = {};
interest_per_month = amount*rate;
amount = parseFloat(amount - emi - interest_per_month);
dataJson['installment_no'] = i;
dataJson['installment'] = Math.round(interest_per_month + (emi - interest_per_month)).toFixed(2);
dataJson['interest'] = Math.round(interest_per_month).toFixed(2);
dataJson['principal'] = Math.round(emi - interest_per_month).toFixed(2);
dataJson['balance_principal'] = Math.round(amount).toFixed(2);
dataJson['opening_balance'] = Math.round(openingBal).toFixed(2);
amt_initially = Math.round(amount).toFixed(2);
schedule.push(dataJson);
}
if(toReturn){
return schedule;
}else {
return parseFloat(amount);
}
},
rateBasedClassic: function (amount, rate, tenure) {
var rate_per_yr = parseFloat((rate/12)/100);
var amt_initially = amount;
var emi_basic = parseFloat(this.basicEMI(amount,rate,tenure));
var total_interest = Math.round((emi_basic*tenure)-amount);
var total_amount = Math.round(emi_basic*tenure);
var interest_per_month = Math.round(total_interest/tenure);
var amount_paid = 0.0;
var toReturn = [];
for(var i=1; i<=tenure; i++){
var dataJson = {};
amount_paid = parseFloat(amount_paid + emi_basic);
interest_per_month = amount * rate_per_yr;
amount = (amount - (emi_basic - interest_per_month));
dataJson['installment_no'] = i;
dataJson['installment'] = Math.round(interest_per_month + (emi_basic - interest_per_month)).toFixed(2);
dataJson['interest'] = Math.round(interest_per_month).toFixed(2);
dataJson['principal'] = Math.round(emi_basic - interest_per_month).toFixed(2);
dataJson['balance_principal'] = Math.round(amount).toFixed(2);
dataJson['opening_balance'] = Math.round(amt_initially).toFixed(2);
amt_initially = Math.round(amount).toFixed(2);
toReturn.push(dataJson);
}
return toReturn;
},
EMIBasedClassic : function (amount, tenure, emi) {
var amt_initially = amount;
var total_amount = emi*tenure;
var total_interest = total_amount - amount;
var rate = 0.0;
var toReturn = false;
var balance = this.getBalanceClassic(amount,rate,tenure,emi,amt_initially,toReturn);
while(balance<0){
rate += 0.1;
var rate2 = parseFloat((rate/12)/100);
balance = this.getBalanceClassic(amount,rate2,tenure,emi,amt_initially,toReturn);
}
while(balance>0){
rate -= 0.0000001;
var rate2 = parseFloat((rate/12)/100);
balance = this.getBalanceClassic(amount,rate2,tenure,emi,amt_initially,toReturn);
}
toReturn = true;
var rate2 = parseFloat((rate/12)/100);
balance = this.getBalanceClassic(amount,rate2,tenure,emi,amt_initially,toReturn);
return balance;
}}
使用参数(600000,9,19080)调用EMIBasedClassic方法会导致在while循环中完成增量增加/减少的问题。相同的逻辑在Java中运行良好。这有什么不对?
答案 0 :(得分:0)
当你调用getBalance classic时,你每次都使用相同的参数。这意味着平衡,总是相同的价值。我不确定要传递给函数的值,但无论您传递什么值,当前设置都将始终运行无限循环。过度看待这么小的事情是非常容易的。
function (amount, tenure, emi) {
var amt_initially = amount;
var total_amount = emi*tenure;
var total_interest = total_amount - amount;
var rate = 0.0;
var toReturn = false;
var balance = this.getBalanceClassic(amount,rate,tenure,emi,amt_initially,toReturn);
while(balance<0){
rate += 0.1;
var rate2 = parseFloat((rate/12)/100);
balance = this.getBalanceClassic(amount,rate2,tenure,emi,amt_initially,toReturn);
}
while(balance>0){
console.log("__BALANCE__: ", balance);
rate -= 0.0000001;
var rate2 = parseFloat((rate/12)/100);
//Balance will always be the same. Do we want to pass balance or amount?
balance = this.getBalanceClassic(amount,rate2,tenure,emi,amt_initially,toReturn);
}
toReturn = true;
var rate2 = parseFloat((rate/12)/100);
balance = this.getBalanceClassic(amount,rate2,tenure,emi,amt_initially,toReturn);
return balance;
}
您只想在第一次使用该功能中的金额。之后,您想要使用余额。 我在while循环中将它从金额更改为余额并且有效。
这是我在repl中的代码: