Wie andere bereits erwähnt haben, möchten Sie wahrscheinlich die BigDecimal
Klasse verwenden, wenn Sie eine genaue Darstellung von 11.4 wünschen.
Nun eine kleine Erklärung, warum dies geschieht:
Die float
und double
primitiven Typen in Java sind Gleitkommazahlen , wobei die Zahl als binäre Darstellung eines Bruchs und eines Exponenten gespeichert wird.
Insbesondere ist ein Gleitkommawert mit doppelter Genauigkeit wie der double
Typ ein 64-Bit-Wert, wobei:
- 1 Bit bezeichnet das Vorzeichen (positiv oder negativ).
- 11 Bits für den Exponenten.
- 52 Bits für die signifikanten Ziffern (der Bruchteil als Binärzahl).
Diese Teile werden kombiniert, um eine double
Darstellung eines Wertes zu erzeugen .
(Quelle: Wikipedia: Doppelte Präzision )
Eine ausführliche Beschreibung des Umgangs mit Gleitkommawerten in Java finden Sie in Abschnitt 4.2.3: Gleitkommatypen, -formate und -werte der Java-Sprachspezifikation.
Die byte
, char
, int
, long
Typen sind Festkommazahlen, die genauen representions von Zahlen sind. Im Gegensatz zu Festkommazahlen können Gleitkommazahlen manchmal (sicher "meistens") keine genaue Darstellung einer Zahl zurückgeben. Dies ist der Grund, warum Sie 11.399999999999
als Ergebnis von enden 5.6 + 5.8
.
Wenn Sie einen genauen Wert benötigen, z. B. 1,5 oder 150,1005, sollten Sie einen der Festkommatypen verwenden, der die Zahl genau darstellen kann.
Wie bereits mehrfach erwähnt, verfügt Java über eine BigDecimal
Klasse, die sehr große und sehr kleine Zahlen verarbeiten kann.
Aus der Java-API-Referenz für die BigDecimal
Klasse:
Unveränderliche vorzeichenbehaftete Dezimalzahlen mit beliebiger Genauigkeit. Ein BigDecimal besteht aus einem nicht skalierten Ganzzahlwert mit beliebiger Genauigkeit und einer 32-Bit-Ganzzahlskala. Bei Null oder positiv ist die Skala die Anzahl der Stellen rechts vom Dezimalpunkt. Wenn negativ, wird der nicht skalierte Wert der Zahl mit zehn multipliziert mit der Potenz der Negation der Skala multipliziert. Der Wert der durch BigDecimal dargestellten Zahl ist daher (unscaledValue × 10 ^ -Skala).
Es gab viele Fragen zum Stapelüberlauf in Bezug auf Gleitkommazahlen und deren Genauigkeit. Hier ist eine Liste verwandter Fragen, die von Interesse sein können:
Wenn Sie wirklich auf die Details von Gleitkommazahlen eingehen möchten, schauen Sie sich an, was jeder Informatiker über Gleitkomma-Arithmetik wissen sollte .