Perché è necessario specificare un suffisso f
in un valore letterale float?Java: Perché è necessario specificare una "f" in un valore letterale float?
risposta
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.)
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
@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.) –
@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
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");
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.
Grazie per la risposta – stackoverflow
- 1. Perché è necessario aggiungere una L o F dopo un valore assegnato a una costante C++?
- 2. Perché è necessario specificare la dimensione heap Java?
- 3. il valore minimo di float in java è positivo perché?
- 4. Perché un valore letterale intero è seguito da un punto un valore letterale numerico valido in JavaScript?
- 5. Perché '\ 117' è un carattere letterale valido in Java?
- 6. -128 come valore letterale binario in Java
- 7. convertire un float in stringa in F #?
- 8. Perché un valore letterale stringa vuoto è considerato true?
- 9. Determinare se una stringa è un valore float valida
- 10. Perché è consentito un valore letterale wchar_t vuoto?
- 11. Perché la "f" è necessaria quando si dichiarano i float?
- 12. Come arrotondare un float in F #?
- 13. Errore: è necessario specificare una proprietà o una funzione URL
- 14. Perché è necessario digitare?
- 15. Perché è necessario un SecretKeySpec quando si ricava una chiave da una password in Java?
- 16. F # - moltiplicare int per float
- 17. Valore letterale caratteri Java con getNumericValue()
- 18. Ragionamento dietro dover specificare L per lungo, F, D per float, doppio
- 19. Perché non c'è ceil (float) in Java?
- 20. È necessario specificare trap diversi da EXIT?
- 21. Perché non è necessario assegnare il valore di ritorno di un metodo a una variabile?
- 22. Errore di configurazione Vagrant - "È necessario specificare una casella."
- 23. Quando è necessario specificare le durate esplicite in Rust?
- 24. Come aggiungere una chiave valida senza specificare un valore in una std :: map?
- 25. Come posso specificare un oggetto letterale tipizzato in TypeScript?
- 26. Perché è necessario utilizzare gli operatori di spostamento in java?
- 27. Perché @Override necessario in java o android?
- 28. Qual è la differenza tra Float e float in java?
- 29. Perché è necessario specificare l'opzione -i con un'estensione di backup quando si utilizza ActivePerl?
- 30. Perché è necessario NotificationCompat?
Perché altrimenti, non sarà un letterale _float_. – SLaks
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 –
possibile duplicato di [perché f è collocato dopo i valori float?] (http: // stackoverflow. it/questions/9748160/why-f-is-placed-after-float-values) –