JSFiddle - React, Tailwind, and code Playground

by Eric Abutaliev

HTML

<button id="psk">Посчитать пск!</button>

JavaScript

document.getElementById('psk').onclick=function(){
    //входящие данные - даты платежей
    var dates = [ 
        new Date(2014, 8, 01),
        new Date(2014, 9, 01),
        new Date(2014, 10, 01),
        new Date(2014, 11, 01),
        new Date(2015, 0, 01)
    ];
    //входящие данные - суммы платежей
    var sum = [
        -100000, 
        34002.21, 
        34002.21, 
        34002.21,
        34002.21
    ];
    var m=dates.length; // число платежей

    //Считаем базовый период bp. Для этого расчитываем наиболее часто встречающийся период в днях
    var days_diff=[];
    for (k=1;k<m;k++){
        days_diff[k]=(dates[k]-dates[k-1])/(24*60*60*1000);  
    }   
    var z=-1;
    var count=[];
    var i_count=[];
    for (var key in days_diff) { 
        z++;
        var val = days_diff [key];
        i_count[z]=val;
        count[z]=0;
        for (k=1; k<m; k++){
            if (days_diff[k]==val){
                count[z]++; 
            }
        }
    }
    var count_max=0; 
    var count_max_i=0;
    for (j=0; j<z; j++){
        if(count[j]>count_max){
            count_max=count[j];
            count_max_i=j;            
        }
    }
    var bp=i_count[count_max_i];  
    //Считаем число базовых периодов в году:
    var cbp=Math.floor(365/bp);

    //заполним массив с количеством дней с даты выдачи до даты к-го платежа
    var days=[];
    for (k=0;k<m;k++){
        days[k]=(dates[k]-dates[0])/(24*60*60*1000);  
    }
    
    //посчитаем Ек и Qк для каждого платежа
    var e=[];
    var q=[];
    for (k=0;k<m;k++){
        console.log("days - "+k+"="+days[k])
        e[k]=(days[k]%bp)/bp;
        console.log("e - "+k+"="+e[k])
        q[k]=Math.floor(days[k]/bp);
        console.log("q - "+k+"="+q[k])
    }
    
    //Втупую методом перебора начиная с 0 ищем i до максимального приблежения с шагом s
    var i=0;
    var x=1;
    var x_m=0;
    var s=0.000001;
    while(x>0){
        x_m=x;
        x=0;
        for(k=0;k<m;k++){
           ...