Piccolo problemino con una sottrazione

di il
4 risposte

Piccolo problemino con una sottrazione

Ciao a tutti,
scusate la domanda stupida, ma sto studiando Java da autodidatta e riscontro un piccolo problema.
Ho scritto un piccolo programmino e ho notato che il risultato non era quello che mi aspettavo.
Ho provato ad eseguire una sottrazione: (15.36 - 15.00) che dovrebbe dare come risultato 0.36, ma inaspettatamente il risultato è 0.35999999999999943

L'istruzione da me scritta è la seguente: System.out.println(15.36 - 15.00);

Qualcuno mi sa spiegare quale errore commetto per favore? A prima vista sembrerebbe che il risultato dell'operazione sia errato.

Grazie a tutti
Daniele

4 Risposte

  • Re: Piccolo problemino con una sottrazione

    Otbmeui ha scritto:


    ma inaspettatamente il risultato è 0.35999999999999943

    L'istruzione da me scritta è la seguente: System.out.println(15.36 - 15.00);

    Qualcuno mi sa spiegare quale errore commetto per favore?
    Non è un "errore" ... è il normale funzionamento della aritmetica in floating-point. I valori float e double hanno un numero "finito" di bit (rispettivamente 32 e 64 bit) e quindi ovviamente NON tutti i valori si possono rappresentare perfettamente. Magari ti sembrerà strano ma ad esempio un valore come 3,1 NON lo si può rappresentare perfettamente in floating-point. Sarà molto molto vicino a 3,1 ma non potrà mai essere esattamente 3,1 perché servirebbe in teoria un numero infinito di bit. Mentre invece valori come 0,5 oppure 2,125 o 4,75 si possono rappresentare esattamente.
    E poi comunque una qualunque operazione (somma, sottrazione, ecc...) introduce ulteriori errori che portano a risultati come quello che hai visto.
  • Re: Piccolo problemino con una sottrazione

    Ma quindi per risolvere il mio problema, e quindi ottenere come risultato della sottrazione 0.36 come dovrei fare?
    Nel mio caso se i risultato non è preciso il programma non funziona a dovere
    Grazie
    Daniele
  • Re: Piccolo problemino con una sottrazione

    Otbmeui ha scritto:


    Ma quindi per risolvere il mio problema, e quindi ottenere come risultato della sottrazione 0.36 come dovrei fare?
    Nel mio caso se i risultato non è preciso il programma non funziona a dovere
    La questione è più "ampia" di quanto forse stai pensando. In ambiti particolari (es. settore finanziario) se si vuole davvero precisione, NON si usano float/double ma la classe java.math.BigDecimal che serve a trattare valori decimali a precisione "arbitraria" o si usano altre tecniche (es. gestire valori decimali come "interi" con numeri di decimali fisso).

    Ti faccio un altro esempio:
    double n = 35.12;
    System.out.println(n);    // stampa 35.12
    
    double s = 0;
    
    for (int i = 0; i < 100000; i++) {
        s = s + n;
    }
    
    System.out.println(s);
    Sommando il valore 100000 volte, dovrebbe venire fuori esattamente 3512000 ma se stampi s ti esce 3512000.000007711

    Se si tratta solo di "stampa", è sufficiente stampare "arrotondato" usando varie API del framework, ad esempio:
    System.out.printf("%.3f", s);   // stampa 3512000,000 (localizzato in italiano)
  • Re: Piccolo problemino con una sottrazione

    Grazie della spiegazione
Devi accedere o registrarti per scrivere nel forum
4 risposte