Come altri hanno già detto, probabilmente vorrai usare la BigDecimal
classe, se vuoi avere una rappresentazione esatta di 11.4.
Ora, una piccola spiegazione del perché questo sta accadendo:
I float
e double
primitivi tipi in Java sono virgola mobile numeri, in cui il numero è memorizzato come una rappresentazione binaria di una frazione e un esponente.
Più specificamente, un valore in virgola mobile a precisione doppia come il double
tipo è un valore a 64 bit, dove:
- 1 bit indica il segno (positivo o negativo).
- 11 bit per l'esponente.
- 52 bit per le cifre significative (la parte frazionaria come binaria).
Queste parti sono combinate per produrre una double
rappresentazione di un valore.
(Fonte: Wikipedia: doppia precisione )
Per una descrizione dettagliata di come vengono gestiti i valori in virgola mobile in Java, consultare la Sezione 4.2.3: Tipi, formati e valori in virgola mobile della specifica del linguaggio Java.
I byte
, char
, int
, long
tipi sono punti fissi numeri, che sono representions esatte di numeri. A differenza dei numeri in virgola fissa, alcune volte i numeri in virgola mobile (si può presumere "il più delle volte") non saranno in grado di restituire una rappresentazione esatta di un numero. Questo è il motivo per cui si finisce con 11.399999999999
il risultato di 5.6 + 5.8
.
Quando si richiede un valore esatto, ad esempio 1.5 o 150.1005, è necessario utilizzare uno dei tipi a virgola fissa, che sarà in grado di rappresentare esattamente il numero.
Come già accennato più volte, Java ha una BigDecimal
classe che gestirà numeri molto grandi e numeri molto piccoli.
Dal riferimento API Java per la BigDecimal
classe:
Numeri decimali immutabili, con precisione arbitraria. Un BigDecimal è costituito da un valore intero non scalato di precisione arbitraria e da una scala di numeri interi a 32 bit. Se zero o positivo, la scala è il numero di cifre a destra del punto decimale. Se negativo, il valore non scalato del numero viene moltiplicato per dieci per la potenza della negazione della scala. Il valore del numero rappresentato da BigDecimal è quindi (unscaledValue × 10 ^ -scale).
Ci sono state molte domande su Stack Overflow relative alla questione dei numeri in virgola mobile e alla sua precisione. Ecco un elenco di domande correlate che potrebbero essere di interesse:
Se vuoi davvero scendere ai dettagli grintosi dei numeri in virgola mobile, dai un'occhiata a Ciò che ogni scienziato informatico dovrebbe sapere sull'aritmetica in virgola mobile .