2017-01-06 2 views
0

Ich bin neu in der Java-Sprache und bereite mich kürzlich auf die Oracle-Basiszertifizierungsprüfung vor. Hier ist eine Frage, die mich verwirrt, während ich mir einige Beispielfragen anschaue.Warum 'f' im Feld des Float-Typs nach der Berechnung entfernt wird

Wenn Sie ein Feld im Float-Typ initiieren, müssen Sie einen Wert wie '1.0f' angeben. Aber wenn es zur Berechnung kommt, ist das "f" nicht mehr notwendig. Sogar in dem Ergebnis der Berechnung, um Felder vom Typ zu floaten, fehlt 'f'. Nur neugierig, was mit ihm passiert und Einfluss. Ich würde es sehr schätzen, wenn sich jemand dafür Zeit nehmen könnte. Vielen Dank im Voraus.

float x = 22.00f % 3.00f; 
System.out.println(x); 

Ausgabe nach Lauf 1,0 statt 1.0f

ich JDK1.8 bin mit.

+5

'f' ist nur ein Signal für den Compiler, dass es ein Float-Wert ist. Es ist nicht Teil des Werts selbst, daher ist es beim Drucken nicht enthalten. – shmosel

Antwort

4

f ist Teil eines float Literal, nicht Teil des Wertes.

2f ist ein Float-Literal, aber die Zeichenfolgendarstellung seines Werts ist 2.0. f ist nur da, um dem Compiler zu sagen, dass "dies ein Float-Literal ist!"

In der Tat, wenn Sie gerade tun:

float x = 22.00f; 
System.out.println(x); 

Sie erhalten die Ausgabe 22.0. Sie verlieren immer noch die f.

Es ist wie String-Literale. Wenn man sie in Code zu schreiben, fügen Sie "" s:

String a = "Hello"; 

Aber wenn man sie aus drucken, verlieren Sie die "" s.

+1

Ich mag diese Antwort für den Vergleich mit den Zitaten für den String. – AxelH

0

Das "F" -Zeichen ist einfach ein Schwimmers Typsuffix in float Literale wie in JLS §3.10.2. Floating-Point Literals erläutert. Literale werden nur im Quellcode verwendet. Der Compiler muss sie als einen bestimmten Typ interpretieren.

Insbesondere ist es nicht Teil des Werts, der in einer typisierten Variablen float gespeichert wird. Schauen Sie sich das Code-Schnipsel:

float a = 22.00f; 
float b = 3.00f; 
float x = a % b; 
System.out.println(a); 
System.out.println(b); 
System.out.println(x); 

Dies gibt:

22,0
3,0
1,0

etwas ganz anderes: Sind Sie sich bewusst, dass Sie die modulo operation verwenden % was verhält sich als Integer-Only-Operation bei Verwendung von Floats? Float-Werte werden abgeschnitten (nicht gerundet), bevor sie tatsächlich geteilt werden. Weitere Informationen finden Sie unter JLS §15.17.3. Remainder Operator %.

+1

Ihre letzte Bemerkung kann auf verschiedene Arten interpretiert werden. In Java kann der ** Rest ** -Operator '%' mit Floats und Doubles aufgerufen werden. Das Ergebnis wird auch ein Float oder Double sein, aber keinen Bruchteil haben. (Aus der JLS: "In C und C++ akzeptiert der Restoperator nur ganzzahlige Operanden, aber in der Programmiersprache Java akzeptiert er auch Gleitkommaoperanden.)" –

+0

@ErwinBolwidt Ich habe diesen Satz umformuliert. Vielleicht wird der Punkt jetzt klarer. – Seelenvirtuose

1

Weil die Dokumentation so sagt.System.out ist ein PrintStream, so:

PrintStream.println(float x): Diese Methode verhält sich, als ob es print(float) und dann println() aufruft.

PrintStream.print(float f): Der durch String.valueOf(float) erzeugten Zeichenfolge in Bytes übersetzt entsprechend die Standardzeichencodierung der Plattform, und diese Bytes werden in genau die Art und Weise des Verfahrens write(int) geschrieben.

String.valueOf(float f): Die Darstellung ist genau die eine durch die Float.toString Verfahren nach einem Argument zurückgegeben.

Float.toString(float f): Wenn m größer oder gleich 10 -3 aber weniger als 10 , dann wird es als der ganzzahligen Teil von m , in Dezimalschreibweise Form ohne führende Nullen, gefolgt von '.' ('\ u002E'), gefolgt von einer oder mehreren Dezimalziffern, die den Bruchteil von m darstellen.

Kein "float" -Suffix hinzugefügt.

0

Aus meinem Verständnis ist der Hauptgrund für das Hinzufügen von "f" nach einer Zahl, es vom doppelten zu unterscheiden. Zum Beispiel

float x= 2.002f; 
double y = 2.002; 

'f' nur java sagen, dass die Zahl ein float ist. Wenn Sie eine Berechnung ausführen, hat 'f' keinen Einfluss darauf.

0

Bitte sehen dies nicht als blinder Gleitkommawert float f=22.00f;

Dies ist der Compiler intim, dass der Floating-Wert 22.00 vom Typ float ist. Standardmäßig 22.00 wird als doppelt genommen, Suffix f ist, den Compiler, dass seine Float und nicht doppelt.

Verwandte Themen