Java: Unterschied float und double?

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

float und double sind Typen für Gleitkommazahlen.

float:

  • belegt 4 Byte (32 Bit)
  • Vorzeichenbehaftet (signed)
  • Wertebereich: 1.40129846432481707e-45 bis 3.40282346638528860e+38 (im Positiven und Negativen), Zuzüglich der 0

double:

  • belegt 8 Byte (64 Bit)
  • Vorzeichenbehaftet (signed)
  • Wertebereich: 1 .7e–308 bis 1 .7e+308 (im Positiven und Negativen), Zuzüglich der 0

double besitzt doppelten Speicherplatz als float (daher auch "double"), damit ist die Mantisse der Zahl größer. Wie du sicher weißt haben reelle Zahlen eine unendliche Zahlendichte. D.h. zwischen 0 und 1 gibts unendlich viele Zahlen, zwischen 0.0000000001 und 0.0000000002 gibts unendlich viele, usw. nimm 2 beliebige Zahlen, zwischen den beiden gibt es unendlich viele dazwischen. Diese Zahlen werden dann auch unendlich lang (unendliche Anzahl an Ziffern). Unendlich viele Ziffern zu speichern benötigt aber unendlich viel Speicherplatz -> geht nicht. Daher sind beide Typen von der Genauigkeit der Kommazahlen (und auch ganzen Zahlen) begrenzt. Umgangssprachlich gesprochen: "irgendwo wird die Zahl abgeschnitten". Und dieses "irgendwo" ist bei double deutlich weiter.

Das bedeutet, dass jede float-Zahl in einem double gespeichert werden kann, aber nicht jede double in einem float. Ist die Zahl "zu genauer" als float das speichern kann, geht diese zusätzliche Genauigkeit verloren, genauso wie das bei float und int ist (speicherst du 3.14159 in ein int geht alles nach dem Komma verloren).

Und das ist auch der Grund weshalb du ein "f" angeben musst, wenn du die Zahl als float meinst. Wenn du das ohne f am Ende der Zahl versuchst denkt Java "Was machst du da? Double passt nicht in Float".

Warum dann float wenns doch schlechter ist? Manche Prozessoren können mit Float schneller rechnen als mit double und es braucht die Hälfte an Speicher. Das kann bei vielen Variablen ins Gewicht fallen.

Es gibt noch weitere "seltsame Notationen", die dir sicher noch über den Weg laufen, nämlich wie man Binärwerte, Okalzahlen und Hexadezimalzahlen angibt. Hier ein Beispiel mit der Zahl 255:

int a = 255; //Angabe im Dezimalsystem (Basis 10)
int b = 0xFF; //"0x" am Anfang gibt an, dass du die Zahl (255) im Hexadezimalsystem (Basis 16) angibst 
int c = 0377; // beginnt eine Zahl mit 0 interpretiert Java das als Oktalzahl (Basis 8)
int d = 11111111b; //b am Ende bedeutet Binärzahl (Basis 2)

Gerade bei Oktalzahlen kann man sich schnell Probleme einfangen. Aus Unachtsamkeit stellt man eine 0 voran (0255 ist nicht gleich 255!) und plötzlich ist die Zahl ne ganz andere.

Solltest du genauere Zahlen brauchen als double und long das können, benutze BigDecimal.

float ist 32bit, double ist 64bit.

Standardmäßig verwendet Java für die meisten Operationen double, daher hat ein Ausdruck wie "24.8" den Typ double und damit 64bit.

Wenn du ein float initialisieren willst, machst du entweder:

tuna=(float)24.8;

oder

tuna=24.8f

der Unterschied: Bei der ersten Variante erstellst du eine 64bit-Konstante, die du zur 32bit umcastest, bei der zweiten Variante hast du aber direkt 32bit(Das ist optimierungstechnisch günstiger).

Ich hoffe, ich konnte helfen.

Solche Datentypen kommen ursprünglich aus der Programmiersprache c . Der float-Datentyp ist ein Datentyp für Fließkomma-Zahlen, für die Speicherung werden 32bit verwendet, der double-Datentyp benutzt die doppelte Bitbreite.