Esempio:
float timeRemaining = 0.58f;
Perché è frichiesto alla fine di questo numero?
Esempio:
float timeRemaining = 0.58f;
Perché è frichiesto alla fine di questo numero?
double & int .
Risposte:
La tua dichiarazione di un float contiene due parti:
timeRemainingè di tipo float.0.58a questa variabile.Il problema si verifica nella parte 2.
Il lato destro viene valutato da solo. Secondo la specifica C #, un numero contenente un punto decimale che non ha un suffisso viene interpretato come un double.
Quindi ora abbiamo un doublevalore che vogliamo assegnare a una variabile di tipo float. Per fare ciò, deve esserci una conversione implicita da doublea float. Non esiste tale conversione, perché potresti (e in questo caso lo fai) perdere informazioni durante la conversione.
Il motivo è che il valore utilizzato dal compilatore non è realmente 0,58, ma il valore a virgola mobile più vicino a 0,58, che è 0,57999999999999978655962351581366 ... per doubleed esattamente 0,579999946057796478271484375 per float.
A rigor di termini, il fnon è richiesto. Puoi evitare di dover utilizzare il fsuffisso trasmettendo il valore a float:
float timeRemaining = (float)0.58;
(float) 0.58funzionerà? Prima hai detto che non c'è conversione, perché le informazioni potrebbero essere perse, allora come mai il cast funzionerà?
2.4è interpretata come un doppio ovunque. 2. Le conversioni restrittive implicite (come da double a float) non sono consentite. Se vuoi fare un'eccezione a queste regole, devi avere un'ottima ragione. È probabile che il salvataggio di 1 battuta di tasto non sia sufficiente.
Poiché esistono diversi tipi numerici che il compilatore può utilizzare per rappresentare il valore 0.58: float, doublee decimal. A meno che tu non sia d'accordo con il compilatore che ne sceglie uno per te, devi disambiguare.
La documentazione per doubleafferma che se non specifichi tu stesso il tipo, il compilatore sceglie sempre doublecome tipo di qualsiasi letterale numerico reale:
Per impostazione predefinita, un valore letterale numerico reale sul lato destro dell'operatore di assegnazione viene considerato doppio. Tuttavia, se desideri che un numero intero venga trattato come doppio, utilizza il suffisso do D.
L'aggiunta del suffisso fcrea un float; il suffisso dcrea un double; il suffisso mcrea un file decimal. Tutti questi funzionano anche in maiuscolo.
Tuttavia, questo non è ancora sufficiente per spiegare perché non viene compilato:
float timeRemaining = 0.58;
La metà mancante della risposta è che la conversione da double 0.58a float timeRemainingpotenzialmente perde informazioni, quindi il compilatore si rifiuta di applicarla implicitamente. Se aggiungi un cast esplicito, viene eseguita la conversione; se aggiungi il fsuffisso, non sarà necessaria alcuna conversione. In entrambi i casi il codice verrà quindi compilato.
inte una per double.
double a = 0.69f;?
floatin double.
Il problema è che .NET, per consentire l'esecuzione di alcuni tipi di operazioni implicite coinvolgenti floate double, doveva o specificare esplicitamente cosa dovrebbe accadere in tutti gli scenari che coinvolgono operandi misti oppure consentire che le conversioni implicite tra i tipi siano eseguite in uno solo direzione; Microsoft ha scelto di seguire l'esempio di Java nel consentire la direzione che occasionalmente favorisce la precisione, ma spesso sacrifica la correttezza e generalmente crea problemi.
In quasi tutti i casi, prendendo il doublevalore più vicino a una particolare quantità numerica e assegnandolo a a si floatotterrà il floatvalore più vicino a quella stessa quantità. Ci sono alcuni casi d'angolo, come il valore 9.007.199.791.611.905; la migliore floatrappresentazione sarebbe 9,007,200,328,482,816 (che è disattivata di 536,870,911), ma la migliore doublerappresentazione (cioè 9,007,199,791,611,904) a float9,007,199,254,740,992 (che è disattivata di 536,870,913). In generale, tuttavia, convertire la migliore doublerappresentazione di una certa quantità in floatprodurrà la migliore floatrappresentazione possibile o una delle due rappresentazioni che sono essenzialmente ugualmente buone.
Notare che questo comportamento desiderabile si applica anche agli estremi; per esempio, la migliore floatrappresentazione per la quantità 10 ^ 308 corrisponde alla floatrappresentazione ottenuta convertendo la migliore doublerappresentazione di quella quantità. Allo stesso modo, la migliore floatrappresentazione di 10 ^ 309 corrisponde alla floatrappresentazione ottenuta convertendo la migliore doublerappresentazione di quella quantità.
Sfortunatamente, le conversioni nella direzione che non richiede un cast esplicito raramente sono altrettanto accurate. La conversione della migliore floatrappresentazione di un valore in doubleraramente produrrà qualcosa di particolarmente vicino alla migliore doublerappresentazione di quel valore, e in alcuni casi il risultato potrebbe essere sfasato di centinaia di ordini di grandezza (ad esempio convertendo la migliore floatrappresentazione di 10 ^ 40 in doubleprodurrà un valore che confronta maggiore della migliore doublerappresentazione di 10 ^ 300.
Purtroppo, le regole di conversione sono quello che sono, quindi bisogna convivere con l'uso di stupidi typecast e suffissi quando si convertono i valori nella direzione "sicura", e fare attenzione ai typecast impliciti nella direzione pericolosa che spesso produrrà risultati fasulli.
double.