Я внедрил калькулятор 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;
}}
Вызов метода EMIBasedClassic с параметрами (600000,9,19080) вызывает проблему, когда в циклах while было сделано инкрементное увеличение / уменьшение.Та же логика отлично работает в Java.Что здесь не так?