Visualizzazione dei risultati da 1 a 4 su 4

Discussione: problema con toFixed

  1. #1

    problema con toFixed

    Ciao,
    sto usando la funzione toFixed per correggere il noto problema di javascript sui decimali.
    Ho notato questa anomalia:

    codice:
    <script language="javascript">
    	function calcola_sconto(valore,array_sconti){
    		valore_da_scontare = valore;
    		for(var i=0;i<array_sconti.length;i++){
    			importo_da_scontare = (valore_da_scontare * array_sconti[i])/100;
    			importo_da_scontare = importo_da_scontare.toFixed(6);
    			valore_da_scontare = valore_da_scontare - importo_da_scontare;
    			valore_da_scontare = valore_da_scontare.toFixed(6);
    			
    		}
    	//	valore_da_scontare = valore_da_scontare.toFixed(2);
    		alert("TOTALE DEFINITIVO :"+valore_da_scontare);
    	}
    	
    	elenco_sconti = new Array();
    	elenco_sconti.push(0.5);
    	elenco_sconti.push(1.2);
    	elenco_sconti.push(2);
    	elenco_sconti.push(1);
    	da_scontare = 10;
    	calcola_sconto(da_scontare,elenco_sconti);
    </script>
    La funzione calcola_sconto riceve come parametro un importo da scontare (nell'esempio, 10) e un array contenenti una serie di sconti da applicare in cascata, come accade su alcune fatture.

    Durante il ciclo vorrei mantenere una certa precisione decimale (uso toFixed con 6 decimali), per evitare imprecisioni nel calcolo; il risultato finale però lo vorrei arrotondato a 2 decimali.

    Se provo ad usare toFixed(2) sulla somma che esce dal ciclo (commentata nell'esempio) mi dà errore, sia con firefox ("is not a function") che con IE.

    Sbaglio qualcosa io o è un problema di javascript?

  2. #2
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116

    Re: problema con toFixed

    Originariamente inviato da l'evangelista
    Sbaglio qualcosa io o è un problema di javascript?

    Sbagli te

    Hai due soluzioni:
    Dato che quel metodo si applica a number e non a string, lo trasformi in number e poi applichi il metodo:

    valore_da_scontare = (parseFloat(valore_da_scontare)).toFixed(2);


    ma meglio, secondo me, è togliere
    valore_da_scontare = valore_da_scontare.toFixed(6); dal ciclo, in modo da conservare la massima precisione, per poi fare, alla fine,
    valore_da_scontare = valore_da_scontare.toFixed(2);


    ps. dentro il ciclo, la moltiplicazione e divisione fanno si che valore_da_scontare sia un number, perciò, valore_da_scontare = valore_da_scontare.toFixed(6); funziona.
    Pietro

  3. #3
    ciao pietro,
    scusa se non ti ho ringraziato subito, avevo gia letto la tua risposta ma non ho avuto tempo di correggere lo script.
    adesso ho provato, è tutto ok.. tnx!
    una cosa non mi è chiara:

    Originariamente inviato da pietro09
    ps. dentro il ciclo, la moltiplicazione e divisione fanno si che valore_da_scontare sia un number, perciò, valore_da_scontare = valore_da_scontare.toFixed(6); funziona.
    quindi se javascript trova un'operazione aritmetica tratta la var come un numero.. subito dopo però (pur non eseguendo nessuna operazione su quella variabile!) la considera una stringa?

  4. #4
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Quando sei nel ciclo for, alla fine, l'ultima operazione prima di uscire è:

    valore_da_scontare = valore_da_scontare.toFixed(6);

    valore_da_scontare, alla fine, è una stringa.
    Pietro

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.