Visualizzazione dei risultati da 1 a 8 su 8
  1. #1

    calcolo tasso di interesse

    Ciao a tutti
    Ho trovato un codice in js che calcola il tasso di interesse composto di un mutuo conoscendo l'importo finanziato la durata e la rata.
    Il risultato è però difforme da quello che mi restituisce excel e altri siti online.
    l'esempio utilizzato è questo:
    Importo: 150000
    rata: 1006
    durata: 20 anni (240 mesi)
    rata mensile: 12
    il Risultato è 5,31% invece dovrebbe venire 5,20% (arrotondati)
    sapreste trovarmi l'errore??? grazie mille x l'aiuto

    vi allego il codice

    <script>
    //variabili globali
    rapporto = 0;
    nk = 0;

    //implementazione della funzione
    function f(x)
    {
    return (1-rapporto*x)*Math.pow(1+x,nk)-1;
    }

    //funzione di i/o con la pagina XHTML
    function calcoloTasso(mutuo,rata,anni,periodo)
    {
    m = parseFloat(mutuo);
    r = parseFloat(rata);
    n = parseInt(anni)
    k = parseInt(periodo);
    rapporto = m/r;
    nk = n*k;
    if (rapporto>=nk)
    {
    alert("dati incongruenti");
    return undefined;
    }
    ik = bisezione(0.00001,1); // algoritmo di bisezione
    ia = Math.pow(1+ik,k)-1; // calcolo del tasso annuo
    ia *=100; // sua espressione in percentuale
    return Math.round(ia*10000)/10000; //arrotondamento al decimillesimo
    }

    //implementazione ricorsiva dell'algoritmo di bisezione
    function bisezione(a,b)
    {
    fa = f(a);
    if (fa==0) return a;
    fb = f(b);
    if (fb==0) return b;
    m = (a+b)/2;
    fm = f(m);
    if (fm==0) return m;
    if ((b-a)<1e-8) return m;
    if (fa*fm<0)
    return bisezione(a,m)
    else
    return bisezione(m,b);
    }

    </script>

    <form action="form_action.asp" method="get" id="dati1" name="dati1"
    style="text-align:center">


    <label for="mutuo1">mutuo</label>
    <input type="text" name="mutuo1" id="mutuo1" size="10" value="100000"
    style="text-align:right"/>&euro;
    </p>


    <label for="rata">rata</label>
    <input type="text" name="rata1" id="rata1" size="12" value="1100"
    style="text-align:right"/>&euro;
    </p>



    <label for="periodo1">periodicità</label>
    <select id="periodo1" name="periodo1">
    <option value="12">mensile</option>
    <option value="6">bimestrale</option>
    <option value="4">trimestrale</option>
    <option value="3">quadrimestrale</option>
    <option value="2">semestrale</option>
    <option value="1">annuale</option>
    </select>
    </p>


    <label for="durata1">durata</label>
    <input type="text" name="durata1" id="durata1" size="3" value="10"
    style="text-align:right"/>anni
    </p>



    <input type="button" value=" calcolo del tasso "
    onclick="tasso1.value=calcoloTasso(mutuo1.value,ra ta1.value,durata1.value,periodo1.value)"/>



    <label for="tasso1">tasso</label>
    <input type="text" name="tasso1" id="tasso1" size="10" value=" "
    style="text-align:right"/>%
    </p>
    </p>
    </form>

  2. #2
    avevo trovato quest'altro script ma non mi funziona!!!

    function calcola_interesse()
    {
    /*
    data la funzione r = f(i) voglio trovare i per un dato r
    r è il valore cercato
    i è il valore iniziale approssimato
    f è l'indirizzo della funzione di calcolo
    */
    var c = parseFloat("0"+document.myForm.capitale.value); // capitale
    var a = parseFloat("0"+document.myForm.anni.value); // numero anni
    var n = parseFloat("0"+document.myForm.nrateanno.value); // N.rate all'anno
    var r = parseFloat("0"+document.myForm.rata.value); // rata data
    var i = 0.01; //Valore iniziale di interesse annuale in %

    var f = calcola_rata;//f(x) è più facile di calcola_rata(x)
    var e = 0.0000000001;//differenza massima tra due valori successivi di calcolo
    var h = 0.1; //rapporto incrementale
    var j, a, a1;

    a = i - ((f(i) - r) * h) / ((f(i+h) - r) - (f(i) - r));
    //alert(a);
    for(j = 1; j <= 10; j++)
    {
    a1 = a - ((f(a)-r)*h) / ((f(a+h)-r)-(f(a)-r));
    //alert(a1);
    if(Math.abs(a1-a) < e) return Math.round(a1 * 100) / 100;
    a = a1;
    }
    return "SUPERATE LE ITERAZIONI CONSENTITE";

    }

    function calcola_rata(i)
    {
    var c = parseFloat("0"+document.myForm.capitale.value); // capitale
    //var i = parseFloat("0"+document.myForm.interesse.value); // interesse
    var a = parseFloat("0"+document.myForm.anni.value); // numero anni
    var n = parseFloat("0"+document.myForm.nrateanno.value); // N.rate all'anno
    var r = parseFloat(rata_CP(c,i,a,n)); // rata calcolata
    return r;

    }

  3. #3
    nessuno sa aiutarmi??? :-(

  4. #4

    hai trovato una soluzione

    Quote Originariamente inviata da pippaccia1971 Visualizza il messaggio
    nessuno sa aiutarmi??? :-(
    Visto che il post è vecchio hai trovato una soluzione? a me da un errore di circa 0.1
    Ciao

  5. #5
    Condivido la soluzione che ho trovato... Ho poi cambiato la funzione ma lasciato l'algoritmo di bisezione invariato. per migliorare la precisione comunque si può provare a cambiare la condizione di uscita dell'algoritmo di bisezione confrontando anche il risultato che sia più vicino allo zero per esempio:

    if ((b-a)<1e-8 && m < 0.01) return m;

    Ovviamente si rischia che il tempo di convergenza dell'algoritmo sia troppo lungo...

  6. #6
    Nella mia soluzione invece ho cambiato la funzione di utilizzata dall'algoritmo di bisezione.
    Metto il codice in c# (non ci vuole molto a convertirlo in Js).
    public staticdouble CalcolaVA(int rateTotali, int ratePagate, double rata, double interesse)
    {
    double totale = 0;
    double interesseNormalizzato = (interesse / 100) / 12; //viene calcolato mensilmente
    for (int i = 1; i <= rateTotali - ratePagate; i++)
    {
    double denominatore = Math.Pow(1 + interesseNormalizzato, i);
    totale += rata * (1 / denominatore);
    }
    return totale;
    }









  7. #7
    private staticdouble f2(double x, double y, int n, double rata){
    double montante = n * rata;
    return (montante - CalcolaVA(n, 0, rata, x)) - y;
    }

    private
    staticdouble bisezionef2(double a, double b, double y, int n, double rata)
    {
    double fa = f2(a, y, n, rata);
    if (fa == 0) return a;
    double fb = f2(b, y, n, rata);
    if (fb == 0) return b;
    double m = (a + b) / 2;
    double fm = f2(m, y, n, rata);
    if (fm == 0) return m;
    if (b - a < 1e-8) return m;
    if (fa * fm < 0)
    return bisezionef2(a, m, y, n,rata);
    else
    return bisezionef2(m, b, y, n,rata);
    }

    public staticdouble CalcolaTanInversa(double y, int n, double rata)
    {
    double ik = bisezionef2(1, 20, y, n, rata);
    returnMath.Round(ik * 100) / 100;
    }

  8. #8
    Moderatore di JavaScript L'avatar di br1
    Registrato dal
    Jul 1999
    Messaggi
    19,998
    Prova questo: http://www.pusceddu.it/htmlit/varie/mutuo.htm

    ps: il risultato e' dato in leggero eccesso
    Ultima modifica di br1; 27-11-2015 a 16:36
    Il guaio per i poveri computers e' che sono gli uomini a comandarli.

    Attenzione ai titoli delle discussioni: (ri)leggete il regolamento
    Consultate la discussione in rilievo: script / discussioni utili
    Usate la funzione di Ricerca del Forum

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.