2012-12-31 30 views
30

Perché è necessario specificare un suffisso f in un valore letterale float?Java: Perché è necessario specificare una "f" in un valore letterale float?

+3

Perché altrimenti, non sarà un letterale _float_. – SLaks

+1

Anche se è per C, ti potrebbe piacere questo quiz sulle sottigliezze costanti a virgola mobile. Credo che ognuna delle cinque domande funzionerebbe esattamente allo stesso modo in Java. http://blog.frama-c.com/index.php?post/2011/11/08/Floating-point-quiz –

+0

possibile duplicato di [perché f è collocato dopo i valori float?] (http: // stackoverflow. it/questions/9748160/why-f-is-placed-after-float-values) –

risposta

39

In caso contrario, il valore predefinito è double, che è un tipo a virgola mobile più comunemente utilizzato rispetto a float.

Dal Java Language Specification, section 3.10.2:

A virgola mobile letterale è di tipo float se suffisso una lettera ASCII F o f; altrimenti il ​​suo tipo è doppio e può opzionalmente essere suffisso con una lettera ASC o D (§4.2.3).

(Personalmente preferirei non ci fossero di default, per chiarire in tutti i casi, ma questo è un altro discorso.)

+1

Ma perché allora avere una decelerazione di un tipo se è impostato su un tipo diverso? Capisco che il doppio è solo un float a 64 bit, ma c'è un motivo più profondo per farlo? – stackoverflow

+1

@stackoverflow: cosa intendi? Il tipo di * literal * è in qualche modo indipendente dal tipo di variabile che usi. Ad esempio, puoi usare un letterale 'float' e assegnarlo a una variabile' double'. Nella maggior parte dei casi, il tipo di un'espressione è indipendente dal contesto in cui viene utilizzato. (Esistono situazioni in cui i tipi sono dedotti per i generici, ma questo è un caso speciale.) –

+1

@stackoverflow Java supporta [conversione di restringimento] (http://docs.oracle.com/javase/specs/jls/se7/html/jls- 5.html # jls-5.2) durante l'assegnazione dei letterali ai primitivi. Questo è il motivo per cui puoi avere 'float f = 1.0;' anche se '1.0' è un doppio.Suppongo che questo sia supportato perché non è ambiguo, diversamente dall'utilizzo di un letterale con una chiamata al metodo, ad esempio. – McDowell

28

Perché letterali in virgola mobile senza suffisso sono doppie, e l'arrotondamento significa che anche i piccoli letterali possono assumere diversi valori quando arrotondati per fluttuare e raddoppiare. Ciò può essere osservato nel seguente esempio:

float f = (float) 0.67; 
if(f == 0.67) 
    System.out.print("yes"); 
else 
    System.out.print("no"); 

Ciò produrrà no, perché 0,67 ha un valore diverso quando arrotondato galleggiare rispetto a quando arrotondato al doppio. D'altra parte:

float f = (float) 0.67; 
if(f == 0.67f) 
    System.out.print("yes"); 
else 
    System.out.print("no"); 

& hellip; uscite yes.

EDIT
Secondo esempio:

if(0.67 == 0.67f) 
    System.out.print("Equal"); 
else 
    System.out.print("Not Equal"); 
4

Esistono due tipi virgola mobile che possono essere rappresentati come ad esempio 100.0. Solo uno potrebbe essere l'impostazione predefinita. A causa della sua precisione limitata, float è un tipo estremamente specializzato. Il caso normale è doppio, quindi è il valore predefinito appropriato.

Sui processori moderni, float e double hanno prestazioni di calcolo simili. L'unico caso per usare float è array di grandi dimensioni in situazioni critiche per le prestazioni che richiedono una precisione limitata. L'utilizzo di float raddoppia il numero di valori in virgola mobile che si adattano a una riga della cache. Anche allora, capire se il float dà una precisione sufficiente per un dato calcolo è raramente banale.

+0

Grazie per la risposta – stackoverflow

Problemi correlati