Javascript цикл занимает слишком много времени для выполнения - PullRequest
0 голосов
/ 30 мая 2018

Я внедрил калькулятор 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.Что здесь не так?

1 Ответ

0 голосов
/ 30 мая 2018

Когда вы вызываете 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:

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...