Visualizzazione dei risultati da 1 a 10 su 10
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2006
    Messaggi
    0

    [JAVA] Errore di calcolo nella somma di double

    Salve a tutti

    ho 12 Double da sommare e controllare che la somma sia uguale a un valore prefissato

    esempio:

    codice:
    Double uno = new Double("1,1");
    Double due = new Double("2,2");
    ...
    Double dodici = new Double("12,12");
    
    // non posso fare un ciclo per motivi lunghi da spiegare, quindi attualmente li sommo cosi'.
    
    double totale = 0;
    
    totale += uno.doubleValue();
    totale += due.doubleValue();
    ...
    totale += dodici.doubleValue();
    i decimali mi perdono di precisione, a caso.

    es, il Double nove mi risulta essere 7,6 ma quando lo sommo ai precedenti e' come se aggiungessi 7, 59999999999 come peraltro mi risulta dall'analisi nel debug.

    come posso essere CERTO della correttezza della somma? dovro' mica fare davvero
    codice:
     
    Double totale  = new Double(uno.doubleValue ()+ due.doubleValue() + .. + dodici.doubleValue());
    ATTENZIONE

    Non sono piu' presente sul forum. Ma potrei tornare a rompere le balle all'improvviso per poi sparire di nuovo.

  2. #2
    Non sono tanto esperto in tipi ma prova ad usare double e non Double (Non so bene la differenza )...
    Perchè vedo che i valori sono Double e il totale double...

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Double (con la maiuscola) sono oggetti.
    double (con la minuscola) sono tipi primitivi.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [JAVA] Errore di calcolo nella somma di double

    Originariamente inviato da Druzya
    codice:
    Double uno = new Double("1,1");
    Double due = new Double("2,2");
    ...
    Double dodici = new Double("12,12");
    Occhio che in quelle stringhe non puoi mettere la virgola, devi mettere il punto!
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Aug 2006
    Messaggi
    0

    Re: Re: [JAVA] Errore di calcolo nella somma di double

    Originariamente inviato da andbin
    Occhio che in quelle stringhe non puoi mettere la virgola, devi mettere il punto!
    si, piccolo lapsus nell'esempio.

    uso i Double perche' cosi' mi arrivano da altre classi e li trasformo in primitive per calcolarli. pero' i decimali si incasinano. perche'? non mi sembra di fare cose particolarmente azzardate.

    so che per evitare la perdita di precisione tra int e long si utilizza la L. c'e' un meccanismo simile per i double?
    ATTENZIONE

    Non sono piu' presente sul forum. Ma potrei tornare a rompere le balle all'improvviso per poi sparire di nuovo.

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Re: Re: [JAVA] Errore di calcolo nella somma di double

    Originariamente inviato da Druzya
    so che per evitare la perdita di precisione tra int e long si utilizza la L. c'e' un meccanismo simile per i double?
    Se metti un valore "letterale" decimale è già double, in pratica 12.34 è lo stesso di 12.34d (mentre invece 12.34f lo rende float).

    Ma non è quello il problema! Il problema è dovuto a come sono rappresentati internamente i numeri in virgola mobile.

    Ecco un altro esempio in cui il risultato non è quello voluto:
    codice:
    public class Prova
    {
        public static void main (String[] args)
        {
            double a = 2.54;
            double b = 2.5;
    
            double dif = a - b;
    
            if (dif == 0.04)
                System.out.println ("uguale");
            else
                System.out.println ("diverso");
        }
    }
    Ebbene: stampa "diverso".
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Aug 2006
    Messaggi
    0

    Re: Re: Re: Re: [JAVA] Errore di calcolo nella somma di double

    Originariamente inviato da andbin
    Se metti un valore "letterale" decimale è già double, in pratica 12.34 è lo stesso di 12.34d (mentre invece 12.34f lo rende float).

    Ma non è quello il problema! Il problema è dovuto a come sono rappresentati internamente i numeri in virgola mobile.

    Ecco un altro esempio in cui il risultato non è quello voluto:
    codice:
    public class Prova
    {
        public static void main (String[] args)
        {
            double a = 2.54;
            double b = 2.5;
    
            double dif = a - b;
    
            if (dif == 0.04)
                System.out.println ("uguale");
            else
                System.out.println ("diverso");
        }
    }
    Ebbene: stampa "diverso".
    ok. perfetto. una soluzione?

    andiamo nello specifico del mio problema con un esempio piu' mirato

    codice:
    //punto o virgola, non fateci caso, non e' quello il problema
    double uno = 8.7;
    double due = 8.7;
    double tre = 8.7;
    double quattro = 8.7;
    double cinque = 8.7;
    double sei = 8.7;
    double sette = 8.7;
    double otto = 8.7;
    double nove = 8.7;
    double dieci = 8.7;
    double undici = 9;
    double dodici = 4;
    
    double totale = uno + due + tre+ quattro + cinque + sei + sette + otto + nove + dieci + undici + dodici;
    ebbene, totale diventa 100,0000001

    perche'?
    ATTENZIONE

    Non sono piu' presente sul forum. Ma potrei tornare a rompere le balle all'improvviso per poi sparire di nuovo.

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Re: Re: Re: Re: [JAVA] Errore di calcolo nella somma di double

    Originariamente inviato da Druzya
    ok. perfetto. una soluzione?
    Non si deve fare una comparazione con == ma un test più specifico per verificare se il valore è più o meno vicino ad un altro.

    Per essere più chiari, invece di fare a == b, devi fare

    d = valore assoluto di (a - b)

    se d >= un valore piccolo (es. 0.0001) allora sono diversi.

    Originariamente inviato da Druzya
    ebbene, totale diventa 100,0000001

    perche'?
    Il problema è dovuto alla rappresentazione in binario. Su un numero finito di bit non puoi rappresentare esattamente tutti i valori possibili.

    Ad esempio 8,7 non può essere rappresentato esattamente in binario su un numero finito di bit. Sarà molto molto vicino a 8.7 ma non sarà mai 8,7 preciso spaccato.
    Mentre 8,75 sì, è possibile rappresentarlo in modo preciso con pochi bit.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Utente di HTML.it
    Registrato dal
    Aug 2006
    Messaggi
    0

    Re: Re: Re: Re: Re: Re: [JAVA] Errore di calcolo nella somma di double

    Originariamente inviato da andbin
    Non si deve fare una comparazione con == ma un test più specifico per verificare se il valore è più o meno vicino ad un altro.

    Per essere più chiari, invece di fare a == b, devi fare

    d = valore assoluto di (a - b)

    se d >= un valore piccolo (es. 0.0001) allora sono diversi.

    Il problema è dovuto alla rappresentazione in binario. Su un numero finito di bit non puoi rappresentare esattamente tutti i valori possibili.

    Ad esempio 8,7 non può essere rappresentato esattamente in binario su un numero finito di bit. Sarà molto molto vicino a 8.7 ma non sarà mai 8,7 preciso spaccato.
    Mentre 8,75 sì, è possibile rappresentarlo in modo preciso con pochi bit.
    capisco. pero' per me e' un grosso problema, allora.

    devo controllare che la somma di 12 percentuali (una per ogni mese) sia uguale a 100% di un costo previsto. mi sa che faccio fatica ad applicare quel calcolo che mi proponi col valore assoluto di a - b
    ATTENZIONE

    Non sono piu' presente sul forum. Ma potrei tornare a rompere le balle all'improvviso per poi sparire di nuovo.

  10. #10
    Utente di HTML.it
    Registrato dal
    Aug 2006
    Messaggi
    0
    risolto: moltiplico ogni singolo double per 100 e poi arrotondo con math.round, tanto sono i primi 2 decimali che mi interessano. fatto questo, sommo tutto su int e poi divido per 100. non molto elegante, ma funziona, pare.


    grazie del ripasso del problema dei double su bit, me l'ero scordato in parte.
    ATTENZIONE

    Non sono piu' presente sul forum. Ma potrei tornare a rompere le balle all'improvviso per poi sparire di nuovo.

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.