Der primitive Datentyp double in Java
Der primitive Datentyp double repräsentiert reelle Zahlen in doppelter Genauigkeit, also mit einer Wortbreite von 64 Bit bzw. 8 Byte. Er eignet sich für Messwerte, mathematische Berechnungen, Physik, Statistik usw.
Der Standardwert für nicht initialisierte Instanzvariablen vom Typ double ist 0.0. Lokale double-Variablen müssen dagegen mit einem Startwert initialisiert werden - eine Sache, die Programmieranfänger häufig übersehen.
Wertebereich und Genauigkeit
- Annähernder Wertebereich: ca. 1.7E−308 bis 1.7E308.
- Genauigkeit: etwa 15 bis 17 signifikante Dezimalstellen.
Vergleiche und Rundungsfehler
Dezimalzahlen lassen sich nicht exakt repräsentieren. Direkte Vergleiche mit dem Operator == führen oft zu Überraschungen, wie das folgende Beispiel zeigt:

Experimente zur Genauigkeit von double-Zahlen
Hier die Konsolenausgabe dieser Methode:
0.30000000000000004 Zahl ist ungleich 0.3 Zahl ist fast 0.3
Daher sollten Vergleiche von zwei double-Zahlen nie mit dem == - Operator durchgeführt werden. In den Zeilen 18 bis 21 sehen wir, wie man zwei double-Zahlen besser miteinander vergleicht. Man definiert einen winzigen Epsilon-Wert wie 10-10 und schaut dann nach, ob die eine Zahl um Epsilon oder mehr von der zu vergleichenden Zahl abweicht. In diesem Fall werden die beiden Zahlen als ungleich interpretiert.
Da die Abweichung vom theoretischen Wert sowohl positiv wie auch negativ sein kann, muss man zunächst den Absolutwert dieser Abweichung ermitteln. Das geschieht in unserem Code-Beispiel mit der Math-Methode abs().
Speichern von double-Zahlen in Sammlungen
In Sammlungen wie ArrayList oder HashMap werden grundsätzlich nur Objekte gespeichert, aber keine primitiven Datentypen wie int oder double.
Will man double-Zahlen in einer solchen Sammlung speichern, muss man sie zuvor in Objekte umwandeln. Dies geschieht mit Hilfe der Wrapper-Klasse Double.
In den neueren Java-Versionen geschieht diese Umwandlung automatisch, wie das folgende Code-Beispiel zeigt:
java.util.List<Double> messwerte = new java.util.ArrayList<>(); messwerte.add(2.5); // Autoboxing zu Double double m = messwerte.get(0); // Unboxing zurück zu double
Man spricht hier von Autoboxing und Unboxing.