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

    problema con decimali su operazioni

    Ragazzi noncapisco perchè au alcuni calcoli l'arrotondamento non funziona com dovrebbe.
    Ho questa funzione:
    codice:
    function calcola(){
    document.form1.iva.value = Math.round(document.form1.imponibile.value * 20)/100;
    document.form1.totale.value = parseFloat(document.form1.imponibile.value) + parseFloat(document.form1.iva.value);
    document.form1.irpef.value = Math.round(((document.form1.imponibile.value * 50)/100)*23)/100;
    document.form1.netto.value = parseFloat(document.form1.totale.value) - parseFloat(document.form1.irpef.value);
    }
    PArtendo dal valore imponibile mi calcola l'iva, il totale, la ritenuta ed il netto.
    Funziona bene, ma non sempre. Supponiamo che io inserisco nell'imponibile un valore uguale a 50.10.
    Mi calcola l'iva = 10.02 - e va bene
    Poi però nel totale fattura che dovrebbe essere 50.10 + 10.02, mi dà come risultato 60.1200000000004.

    Sapete dirmi come mai?
    Ho fatto qualche errore nella formula di arrotondamento per la somma?
    Grazie!

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    E` l'effetto delle operazioni in virgola mobile.

    JS (a differenza di altri linguaggi) non fa l'arrotondamento automatico, ed occorre ogni volta applicare la formula:
    risult = Math.round(risult*100)/100;

    Nel tuo caso, io userei varibaili interne al JS. Tu fai sempre riferimento ai campi di testo.
    codice:
    function calcola(){
      var ff = document.form1;
      var imp = parseFloat(ff.imponibile.value);
      var iva = imp * .2;
      var tot = imp + iva;
      var irp = imp * .5 * .23;
      var net = tot - irp;
      ff.iva.value = Math.round(iva*100)/100;
      ff.totale.value = Math.round(tot*100)/100;
      ff.irpef.value = Math.round(irp*100)/100;
      ff netto.value = Math.round(net*100)/100;
    }
    (spero di non aver commesso errori)
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  3. #3
    Grazie mille per la risposta mich, ma purtroppo non succede nulla quando scrivo un valore su campo testo imponibile....

    Come mai?

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Mi pare che la mia funzione faccia esattamente la stessa cosa della tua, ma potrei sbagliare, quindi controlla.

    Prova anche a metterci degli alert, per verificare i risultati intermedi.

    Altrimenti il problema puo` essere nel modo in cui chiami la funzione.
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  5. #5
    la funzione la richiamo così:

    onKeyUp="calcola()"

    se lascio la mia funziona mi fa il calcolo, ma quando inserisco la tua non ho nessun cambiamento di valore....

    non so perchè...

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Immagino che la chiami dal campo
    <input type="text" name="imponibile" onkeyup="calcola();">
    Se qualcuno degli attributi e` diverso, potrebbe non funzionare.

    Prova comunque ad inserire nella funzione (dopo i calcoli delle varie variabili):
    alert("iva="+iva+" tot="+tot+" irp="+irp+" net="+net);

    e verifica cosa scrive l'alert.
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  7. #7
    Allora ti ringrazio per tutti gli aiuti chemi stai dando, ma purtroppo non siamo ancora arrivati alla soluzione...
    Purtroppo la tua funzione non fa nulla.
    Il codice completo è questo:
    codice:
    <script language="javascript">
    /*function calcola(){
    document.form1.iva.value = Math.round(document.form1.imponibile.value * 20)/100;
    document.form1.totale.value = parseFloat(document.form1.imponibile.value) + parseFloat(document.form1.iva.value);
    document.form1.irpef.value = Math.round(((document.form1.imponibile.value * 50)/100)*23)/100;
    document.form1.netto.value = parseFloat(document.form1.totale.value) - parseFloat(document.form1.irpef.value);
    }*/
    
    function calcola(){
      var ff = document.form1;
      var imp = parseFloat(ff.imponibile.value);
      var iva = imp * .2;
      var tot = imp + iva;
      var irp = imp * .5 * .23;
      var net = tot - irp;
      ff.iva.value = Math.round(iva*100)/100;
      ff.totale.value = Math.round(tot*100)/100;
      ff.irpef.value = Math.round(irp*100)/100;
      ff netto.value = Math.round(net*100)/100;
      {
      alert("iva="+iva+" tot="+tot+" irp="+irp+" net="+net); 
      }
    }
    </script>
    Richiamata ovviamente così:
    codice:
    <input class="carattere" style="border-width:0px;" type="text" name="imponibile" onKeyUp="calcola()">
    Come puoi ben vedere ho commentato la mia vecchia funzione per provare la tua, ma non ho nessuna risposta dal client. Se invece commento la tua e decommento la mia allora la funzione "funziona", ma sempre con quel difetto iniziale del mio post.

    Come mai abbiamo questo problema?
    Grazie infinite

  8. #8
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    manca un punto ff.netto
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Non riesco a capire, ma l'alert non va messo in fondo alla funzione: in caso di errore non si puo` capire.

    Vedi cosi`:
    codice:
    function calcola(){
      alert("inizio");
      var ff = document.form1;
      var imp = parseFloat(ff.imponibile.value);
      alert("imp="+imp);
      var iva = imp * .2;
      var tot = imp + iva;
      var irp = imp * .5 * .23;
      var net = tot - irp;
      alert("iva="+iva+" tot="+tot+" irp="+irp+" net="+net); 
      ff.iva.value = Math.round(iva*100)/100;
      ff.totale.value = Math.round(tot*100)/100;
      ff.irpef.value = Math.round(irp*100)/100;
      ff netto.value = Math.round(net*100)/100;
    }
    Se ancora l'alert non si vede (l'ultimo), occorre spostarlo piu` sopra (togliendo le variabili non ancora definite).
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  10. #10
    Cavolo Andrea grazie!!
    Era solo quel fetente di punto che non avevo proprio visto!!!

    Grazie mille a Mich per la pazienza!

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 © 2025 vBulletin Solutions, Inc. All rights reserved.