ProgrammazioneSviluppatore Java

Quali sono le caratteristiche del lavoro con i tipi di dati float e double in Java? Quando applicare ciascuno di essi e quali possono essere le insidie nel lavorare con numeri in virgola mobile?

Supera i colloqui con l'assistente IA Hintsage

Risposta

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.

  • Quando utilizzare float: se ci sono requisiti molto rigidi riguardo l'occupazione di memoria (ad esempio, un gran numero di numeri in un array, dispositivi a risorse limitate).
  • Quando utilizzare double: praticamente sempre, se non ci sono restrizioni particolari, poiché double offre una precisione migliore.

Caratteristiche importanti:

  • Le operazioni in virgola mobile possono portare a un accumulo di errori di arrotondamento.
  • Non utilizzare mai == per confrontare float/double, utilizzare un confronto con margine di errore.

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 trabocchetto

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.

Esempi di errori reali dovuti a una mancata comprensione delle sottigliezze dell'argomento


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.