Darstellen von Float-Werten in Java

7

Sehen Sie sich die drei Codezeilen unten an.

%Vor%

Die zweite Zeile enthält Kompilierungsfehler, während die anderen Zeilen keine Kompilierungsfehler enthalten. Die erste Zeile funktioniert ohne Suffix f und die dritte Zeile arbeitet mit Suffix f. Warum ist das?

    
Abhishek Jain 13.06.2010, 17:16
quelle

4 Antworten

20

Fließkomma-Literale in Java sind standardmäßig ein double -Wert.

  

JLS 3.10.2 Fließkomma-Literale

     

Ein Fließkomma-Literal hat den Typ float , wenn es mit einem ASCII-Buchstaben versehen ist F oder f ; andernfalls ist sein Typ double und kann optional mit einem ASCII-Buchstaben D oder d ergänzt werden.

Sie können einem double keinen float -Wert zuweisen, ohne dass eine explizite Eingrenzungskonvertierung vorgenommen wurde. Sie haben daher zwei Möglichkeiten:

  • Verwenden Sie für Literale das Suffix f oder F , um einen float -Wert
  • zu bezeichnen
  • Verwenden Sie für Nichtliterale eine explizite Umwandlung (float)

Ein Beispiel für Letzteres ist:

%Vor%

Beim Erweitern von Conversions

Der Grund, warum dies kompiliert:

%Vor%

liegt daran, dass die Erweiterung der Konvertierung von int nach float implizit im Kontext einer Zuweisung erfolgen kann.

  

JLS 5.2 Zuweisungskonvertierung

     

Zuordnungskonvertierung tritt auf, wenn der Wert eines Ausdrucks einer Variablen zugewiesen wird: Der Typ des Ausdrucks muss in den Typ der Variablen konvertiert werden. Zuordnungskontexte ermöglichen die Verwendung eines der folgenden Elemente:

     
  • eine erweiterte primitive Konvertierung (§5.1.2)
  •   
  • [...]
  •   

JLS 5.1.2 Erweiterung der Primitiv-Konvertierung

     

Die folgenden 19 spezifischen Konvertierungen für primitive Typen werden als erweiternde Grundelementkonvertierungen bezeichnet:

     
  • int bis long , float oder double
  •   
  • [...]
  •   

Anderer Datentyp-Suffix für Literale

Wie oben erwähnt, gibt es auch das Suffix D oder d für double . Betrachten Sie dieses Snippet zum Beispiel:

%Vor%

Es gibt auch ein Suffix für long Literale, also L oder l (Kleinbuchstaben). Es wird empfohlen, dass Sie die Großbuchstabe-Variante verwenden.

  

JLS 3.10.1 Ganzzahlige Literale

     

Ein Integer-Literal hat den Typ long , wenn es mit einem ASCII-Buchstaben versehen ist L oder l ( ell ); Sonst ist es vom Typ int . Das Suffix L wird bevorzugt, weil der Buchstabe l ( ell ) oft schwer von der Ziffer 1 ( one ) zu unterscheiden ist.

    
polygenelubricants 13.06.2010, 17:31
quelle
7

Sie weisen einer double -Variable einen float -Wert zu. 1.1 von selbst (ohne das f am Ende angeheftet) wird vom Compiler vom Typ double angenommen. Der Compiler macht keine impliziten Downcasts, weil dort die Präzision verloren gehen kann.

    
Bill the Lizard 13.06.2010 17:19
quelle
0

Erste Zeile autocasts int zum floaten (ok).

Die zweite Zeile konnte aufgrund von Genauigkeitsverlust nicht doppelt in Float umgewandelt werden. Sie müssen Folgendes umsetzen:

%Vor%

Die dritte Zeile muss nicht konvertiert werden.

    
Arne 13.06.2010 17:20
quelle
0

In Java wird für jede Fließkommazahl (jede Zahl mit einem Dezimalpunkt) standardmäßig ein double verwendet, was genauer ist als ein float . Und standardmäßig lässt Java eine double nicht in eine float umwandeln, weil die Präzision verloren geht.

Sie können weiterhin double einem float zuweisen, indem Sie Folgendes umsetzen:

%Vor%     
Justin Ardini 13.06.2010 17:22
quelle

Tags und Links