2012-11-28 13 views
5

Ho 2 doppi nullable, un valore previsto e un valore effettivo (chiamiamoli valore e valoreSpecificato). Viene trovata una percentuale usando 100 * (valore/valoreSpecificato). Tuttavia, se valueExpected è zero, restituisce NaN. Tutto bene finora.Confronto Nullable double NaN in C#

Ora, cosa devo fare se devo verificare il valore, per vedere se è NaN? Normalmente si potrebbe usare:

if (!Double.IsNaN(myDouble)) 

Ma questo non funziona con i valori Null (isNaN funziona solo con variabili non nullable). Ho cambiato il mio codice per fare il check (valueExpected == 0), ma sono comunque curioso: c'è un modo per verificare un NaN nullable?

Modifica: Quando dico che il codice non funziona, voglio dire che non verrà compilato. Il test per null prima non funziona.

risposta

10

Con tutte le istanze Nullable<T>, per prima cosa controllare la proprietà bool HasValue e quindi è possibile accedere alla proprietà T Value.

double? d = 0.0;  // Shorthand for Nullable<double> 
if (d.HasValue && !Double.IsNaN(d.Value)) { 
    double val = d.Value; 

    // val is a non-null, non-NaN double. 
} 
+0

Forse è solo studio visivo che impedisce a me. Ho avuto qualcosa di simile: ' se (myDouble! = Null) { se {// fare cose (Double.IsNaN (myDouble)!)! } } ' Ma questo e il tuo codice non vengono compilati, non mi piace ancora utilizzare IsNaN, anche dopo il controllo 'è nulla'. –

+1

Hai visto ".Value" dopo il nome della variabile "d". d.Value è un double e dovrebbe essere compilato definitivamente. –

+0

Il mio codice viene compilato correttamente. Il controllo "è nullo" che hai aggiunto non cambia nulla. Il tuo codice è ancora errato. 'myDouble' è un' Nullable 'mentre' IsNaN() 'si aspetta un' double'. Tu ** devi ** usare la proprietà '.Value'. –

1

È possibile anche utilizzare

if (!Double.IsNaN(myDouble ?? 0.0)) 

Il valore più interna parentesi sono forniti dal myDouble (con il suo Nullable<> involucro rimosso) se è non nullo, o semplicemente 0.0 se myDouble è null. Se ?? Operator (C#).

0

Ho avuto lo stesso problema e l'ho risolto con il doppio? con il doppio

double.IsNaN((double)myDouble) 

Ciò restituirà vero se Nan e false se non