2009-04-09 12 views

Antwort

9

Das „f“ oben ist eine Art Suffix. Dies teilt dem Compiler den genauen Typ des bereitgestellten Literals mit. Dies wird verwendet, damit der Compiler die richtige Speichermenge (Genauigkeit) für das Literal zuweisen kann. Float-Literale erhalten standardmäßig Speicherplatz für ein "Double". Wenn Sie "f" als Suffix hinzufügen, erhält das Literal nur den Speicher für einen Gleitkommawert, der weniger genau ist.

double d = 50.1234; // given double storage 
double d = 50.1234f; // given float storage, which might lose precision compared to double 
12

Hauptsächlich so dass der Compiler weiß genau, was wir meinen - insbesondere für die Überladungsauflösung:

Foo(57f); 

sollte dieser Anruf Foo(int)/Foo(float)/Foo(decimal)?

Eigentlich mag ich nicht Dinge zu erinnern - eine Alternative ist:

float someFloat = (float)57; 

dies nicht eine Laufzeit Guss - es identisch ist (bei der IL-Ebene) zu 57f. Das einzige Mal, es auf subtile Weise anders ist, ist mit decimal s mit extra Präzision:

decimal someDecimal = (decimal)57.0; // same as 57M, not 57.0M (scale is different) 
3

Standardmäßig wird ein reelles numerisches Literal auf der rechten Seite des Zuweisungsoperators als doppelt behandelt. Daher zu initialisieren, ein float-Variable die Suffix f oder F verwendet zum Beispiel:

float x = 3.5F; 

Wenn Sie nicht das Suffix in der vorherige Erklärung verwenden, erhalten Sie einen Kompilierungsfehler erhalten, weil Sie ein versuchen, zu speichern, double-Wert in eine float-Variable.

Von MSDN: float

-1

Da 57 eine ganze Zahl und 57.0 ist eine doppelte. Sie versuchen, einen Gleitkommawert zu erhalten, der eine Zahl mit einfacher Genauigkeit ist. Das wirft die Frage auf, warum verwenden Sie einen einzelnen Präzisionsschwimmer?

Weitere Informationen zu C# -Literalen finden Sie unter http://www.blackwasp.co.uk/CSharpNumericLiterals.aspx.

1

Schauen Sie sich diesen Artikel, der viel über Zahlenliterale in C#, erklärt: http://www.blackwasp.co.uk/CSharpNumericLiterals.aspx

Hier ist ein kleiner Auszug aus dem Artikel:

float unitprice = 123,45; // Diese kompilieren nicht

Das Problem hier ist, dass man nicht implizit immer ein doppeltes (123,45) in einen Schwimmer konvertieren.Der C# -Compiler versteht dies und stoppt den Code von

kompilierten
0

Ich möchte wissen, warum wir Literale wie f im obigen Fall nutzen sollte ?.

Sie sollten nicht. Nun, Sie haben keine zu.

Der obige Fall zeigt eine Float-Initialisierung für 57f. Ganzzahlen werden implizit in die Kompilierungszeit für Floats konvertiert, sodass Sie das f-Suffix einfach entfernen können, wenn Sie das stört. Aus Gründen der Konsistenz im geschriebenen Code versuche ich jedoch immer, das Suffix hinzuzufügen. Beachten Sie, dass dies nur für gerundete Zahlen (Ganzzahlen) gilt.

Siehe Msdn auf Implicit und Explicit Nummer Gespräche.

0

Warum sollten wir Literale verwenden?

int/int = intaberint/float = float:

int timespanInMS = 500; 

Console.WriteLine("Execution time: {0} sec.", timespanInMS/1000); 
Console.WriteLine("Execution time: {0} sec.", timespanInMS/1000F); 

// Result: 
// Execution time: 0 sec. 
// Execution time: 0.5 sec. 
Verwandte Themen