C# C语言中的可空双NaN比较#

C# C语言中的可空双NaN比较#,c#,double,nan,C#,Double,Nan,我有两个可为空的双精度数,一个期望值和一个实际值(我们称它们为value和valueExpected)。使用100*(值/预期值)找到百分比。但是,如果valueExpected为零,则返回NaN。到目前为止一切都很好 现在,如果我需要检查值,看看它是否为NaN,我该怎么做?通常可以使用: if (!Double.IsNaN(myDouble)) 但这不适用于可为null的值(IsNaN仅适用于不可为null的变量)。我已经更改了代码来执行检查(valueExpected==0),但我仍然很好

我有两个可为空的双精度数,一个期望值和一个实际值(我们称它们为value和valueExpected)。使用100*(值/预期值)找到百分比。但是,如果valueExpected为零,则返回NaN。到目前为止一切都很好

现在,如果我需要检查值,看看它是否为NaN,我该怎么做?通常可以使用:

if (!Double.IsNaN(myDouble))
但这不适用于可为null的值(IsNaN仅适用于不可为null的变量)。我已经更改了代码来执行检查(valueExpected==0),但我仍然很好奇——有没有办法检查可为null的NaN

编辑:当我说代码不工作时,我的意思是它不会编译。首先测试null不起作用。

对于所有实例,首先检查属性,然后才能访问属性

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.
}
double?d=0.0;//空值的简写
if(d.HasValue&!Double.IsNaN(d.Value)){
双val=d.值;
//val是一个非null、非NaN双精度。
}
您也可以使用

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

最里面的括号中的值要么是
myDouble
(去掉了它的
null
包装),如果它是非null,要么就是
0.0
如果
myDouble
null
。Se.

我也遇到了同样的问题,我通过铸造双打解决了这个问题?双倍

double.IsNaN((double)myDouble)
如果为NaN,则返回true;如果不是,则返回false。C#7.0组合的null+NaN检查可以这样写:

double? d = whatever;
if(d is double val && double.IsNaN(val))
   Console.WriteLine(val);

优点是本地范围变量
val
,它不是
null
,也不是
double.NaN
,甚至可以在
if

之外使用,也许正是visual studio阻止了我。我确实有这样的想法:`if(myDouble!=null){if(!Double.IsNaN(myDouble)){//Do stuff!}}`但是这和你的代码没有编译,它仍然不喜欢使用IsNaN,即使在'is null'检查之后。你看到变量名“d”后面的“.Value”了吗。d、 值是一个double,应该可以编译。我的代码编译得很好。您添加的“为空”检查不会改变任何内容。您的代码仍然不正确
myDouble
是一个
null
,而
IsNaN()
需要一个
double
。您必须使用
.Value
属性。啊!是的,这很有效。因此.value将使用它作为不可为null的类型。谢谢我错过了.value。你有没有检查过文档?说到这些事情,MSDN是你最好的朋友
.Value
实际上返回实际的基础值
Nullable
实际上只是一个
T
和一个
bool