Variabili reali

Come si è visto, l'operazione di divisione / fra numeri interi è in realtà il quoziente, che contiene solo la parte intera del risultato della divisione (ossia non include le cifre dopo la virgola). Quando si effettua una divisione come per esempio nel programma DivisioneIntera.java, il risultato risulta quindi troncato.

/*
  In questo programma si fa la divisione di due variabili intere
*/

class DivisioneIntera {
  public static void main(String[] args) {
    int a,b,c;

    a=22;
    b=8;

    c=a/b;

    System.out.println("Il risultato della divisione e': "+c);
  }
}


Se si compila ed esegue il programma, viene stampata la seguente linea:

Il risultato della divisione e': 2

Si potrebbe pensare che il problema risieda nel fatto che 22/8=2.75 non possa venire memorizzato nella variabile c, che è intera e che può quindi contenere solo un numero intero (senza niente dopo la virgola, quindi). In effetti, il motivo è invece che la divisione stessa / fra interi è in realtà il quoziente.

Si pone comunque il problema di come ottenere il risultato esatto 2.75, che include anche i decimali.

Per fare questo, e in generale per eseguire calcoli di cui si vuole conoscere anche il valore dei decimali, è necessario usare variabili di tipo reale. Contrariamente a quello che ci si aspetta, una variabile reale viene dichiarata usando una linea double nomevariabile; Il programma DivisioneReale.java è una versione modificata del precedente, in cui si usano variabile reali invece che intere.

/*
  In questo programma si fa la divisione di due variabili reali
*/

class DivisioneReale {
  public static void main(String[] args) {
    double a,b,c;

    a=22;
    b=8;

    c=a/b;

    System.out.println("Il risultato della divisione e': "+c);
  }
}


Il risultato stampato questa volta contiene anche le cifre decimali. In generale, se si pensa che il risulato di una espressione potrebbe contenere cifre decimali, è bene usare variabili reali invece che intere.

Nota sulle conversioni

Nel primo programma, si potrebbe pensare che il problema risieda nell'assegnamento c=a/b, ossia che il risultato venga troncato perchè non è possibile inserire 22/8=2.75 nella variabile c, che è intera, e che per questo il numero venga troncato a 2. Questo conduce a una soluzione errata, illustrata dal programma DivisioneIntera2.java, riportato qui sotto.

/*
  In questo programma si fa la divisione di due variabili intere
*/

class DivisioneIntera2 {
  public static void main(String[] args) {
    int a,b;
    double c;

    a=22;
    b=8;

    c=a/b;

    System.out.println("Il risultato della divisione e': "+c);
  }
}


In base a quanto detto finora, il risultato dovrebbe essere corretto: si calcola a/b, e il risultato si mette nella variabile reale c. Quello che succede compilando ed eseguendo il programma è che viene stampato ancora il valore 2, ossia solo la parte intera della divisione.

La spiegazione richiede di addentrarsi nei meccanismi di conversione dei tipi usato da Java. Quando è necessario fare una divisione fra due variabili, se entrambe sono intere allora quello che viene fatto è in effetti il quoziente, che è il risultato della divisione privato delle cifre dopo la virgola. In altre parole, se sia a che b sono interi, la divisione a/b produce sempre un risultato intero, indipendentemente dall'uso che si fa di questo risultato.

La divisione fra un numero intero e un reale, o fra due reali, anche se usa lo stesso simbolo / è comunque una divisione e non un quoziente, per cui può dare un risultato non intero.