2009-04-09 16 views

risposta

9

"F" di cui sopra è un suffisso tipo. Questo dice al compilatore il tipo esatto del letterale fornito. Questo è usato in modo che il compilatore possa allocare la quantità appropriata di memoria (precisione) per il letterale. Per impostazione predefinita, ai letterali in virgola mobile viene assegnato lo spazio di archiviazione per un "doppio". Se si aggiunge "f" come suffisso, il letterale otterrà solo lo spazio per un float, che avrà meno precisione.

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

Principalmente in modo che il compilatore sa esattamente che cosa si intende - in particolare per la risoluzione di sovraccarico:

Foo(57f); 

dovrebbe quella chiamata Foo(int)/Foo(float)/Foo(decimal)?

In realtà, non mi piace ricordare le cose - in alternativa è:

float someFloat = (float)57; 

questo è non un cast di runtime - è identico (a livello IL) per 57f. L'unica volta che è sottilmente diverso è con decimal s con una precisione ancora maggiore:

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

Per default, un vero letterale numerico sul lato destro dell'operatore di assegnazione è trattato come doppia. Pertanto, per inizializzare una variabile float utilizzare il suffisso F o F, per esempio:

float x = 3.5F; 

Se non si utilizza il suffisso nella dichiarazione precedente, si otterrà un errore di compilazione perché si sta tentando di memorizzare un doppio valore in una variabile mobile.

Da MSDN: float

-1

Poiché 57 è un intero e 57.0 è un doppio. Stai cercando di ottenere un float, che è un singolo numero di precisione. Questo fa sorgere la domanda, perché stai usando un galleggiante di precisione singola?

Vedere http://www.blackwasp.co.uk/CSharpNumericLiterals.aspx per ulteriori informazioni sui letterali C#.

1

leggi questo articolo che spiega molto sulla numerici letterali in C#: http://www.blackwasp.co.uk/CSharpNumericLiterals.aspx

Ecco un piccolo estratto dell'articolo:

float PrezzoUnitario = 123.45; // Questo non compilerà

Il problema qui è che non si può sempre convertire implicitamente un doppio (123.45) in un galleggiante.Il compilatore C# capisce questo e si ferma il codice venga compilato

0

voglio sapere il motivo per cui dovremmo usare letterali come F nel caso di cui sopra ?.

Non si dovrebbe. Beh, non è avere a.

Il caso precedente mostra un'inizializzazione mobile a 57f. Gli interi vengono convertiti implicitamente in tempo di compilazione float in modo da poter rimuovere facilmente il suffisso f se questo ti infastidisce. Tuttavia, per coerenza nel codice scritto, cerco sempre di aggiungere il suffisso. Si noti che questo si applica solo ai numeri arrotondati (numeri interi).

Vedere Msdn su Implicit e Explicit conversazioni di numero.

0

perché dovremmo usare i letterali?

int/int = intmaint/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. 
Problemi correlati