Javascript循环执行时间太长

时间:2018-05-30 02:48:24

标签: javascript jquery while-loop

我一直在为混合移动应用程序实现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中运行良好。这有什么不对?

1 个答案:

答案 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中的代码:

enter image description here