Enigmi Java: (0.1 * 10) == 1 è false?


DOMANDA:

Perché se sommo dieci volte la variabile double x = 0.1 il controllo 

x == 1 mi da false?


package conversione;

       public class DieciVolte {
                        
           public static void main(String[] args) { 
              double x = 0;
            
              for(int i=0; i<10; i++)
                 x += 0.1;

              if(x == 1)
                 System.out.println("SI, il valore di x è: " + x);
              else
                 System.out.println("NO, il valore di x è: " + x);
           }
        }

RISPOSTA:

La soluzione a questo enigma non dipende da Java, né dal linguaggio di programmazione. 


L'inganno sta nella conversione del numero 0,1 (in base 10) all'equivalente in binario (ovvero in base 2) che risulta essere un numero periodico leggermente inferiore a 0,1 (0,000110000110000110...).  
Questo comporta che sommare 10 volte un numero il cui valore non è mai perfettamente 0,1, porterà ad un risultato che è di poco inferiore a 1 (0,9999999999999999). 
Quindi il controllo 0,9999999999999999 == 1 all'interno dell'IF risulterà correttamente falso!


Commenti

  1. Dove la programmazione non arriva ci pensa l'analisi numerica

    RispondiElimina
  2. Hai ragione Francesco, quando uno ha una convinzione che deriva dall'analisi numerica non deve dare comunque niente per scontato. L'importante è stare attenti ma soprattutto usare il debug, che ti fa accorgere anche di tutti i problemi improbabili tipo questo.

    RispondiElimina

Posta un commento

Post popolari in questo blog

Arrotondamento e troncamento in Java

Eclipse: Shortcuts (scorciatoie) da tastiera

Strutture dati: List, Set, Map

Creare un eseguibile Java