In Java ci sono due tipi principali per rappresentare numeri in virgola mobile: float (32 bit) e double (64 bit). float è meno preciso e occupa meno memoria, mentre double offre una maggiore precisione ed è il tipo predefinito per numeri in virgola mobile.
Caratteristiche importanti:
Esempio di confronto con epsilon:
public class DoubleComparison { public static void main(String[] args) { double a = 0.1 + 0.2; double b = 0.3; double epsilon = 1e-10; if (Math.abs(a - b) < epsilon) { System.out.println("Uguali considerando l'errore"); } else { System.out.println("Non uguali"); } } }
Domanda: Cosa stamperà il seguente codice?
System.out.println(0.1 + 0.2 == 0.3);
Risposta: Questo codice stamperà false perché il risultato della somma 0.1 + 0.2 in formato binario IEEE 754 non è esattamente uguale a 0.3 a causa delle peculiarità della memorizzazione delle frazioni decimali nei tipi float e double.
Storia
In un grande progetto finanziario sono stati utilizzati contatori di denaro nel tipo double. Nella pratica, piccole operazioni portavano spesso a un accumulo di errori di arrotondamento, causando differenze di pochi centesimi nel totale. Il problema è stato risolto sostituendo double con BigDecimal.
Storia
In un motore di gioco è stato utilizzato un array di float per memorizzare le coordinate degli oggetti in un mondo con valori elevati. Durante il movimento su lunghe distanze, la precisione del posizionamento degli oggetti ha iniziato a perdersi, causando il "tremolio" degli oggetti sullo schermo. La sostituzione di float con double e la centralizzazione delle coordinate hanno aiutato a risolvere il problema.
Storia
In un programma di analisi statistica sono stati confrontati valori double utilizzando l'operatore
==e sono stati ottenuti risultati inattesi di "discordanza". Dopo la sostituzione con un confronto con epsilon, la logica del programma ha funzionato correttamente.