C#中的Nullable双NaN比较

时间:2012-11-28 03:25:52

标签: c# double nan

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

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

if (!Double.IsNaN(myDouble))

但这不适用于可空值(IsNaN仅适用于非可空变量)。我已经更改了我的代码来进行检查(valueExpected == 0),但我仍然很好奇 - 有没有办法检查可以为空的NaN?

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

4 个答案:

答案 0 :(得分:10)

对于所有Nullable<T>个实例,首先检查bool HasValue属性,然后您可以访问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.
}

答案 1 :(得分:1)

您也可以使用

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

最内部括号中的值是myDouble(删除了Nullable<>包装)(如果它是非空的),或仅0.0如果myDoublenull。 Se ?? Operator (C#)

答案 2 :(得分:0)

我有同样的问题,我用铸造双重解决了它?加倍

double.IsNaN((double)myDouble)

如果是NaN,则返回true,否则返回false

答案 3 :(得分:0)

使用C#7.0 Pattern matching组合null + NaN check check可以这样写:

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

优点是手边的局部范围变量val既不是null也不是double.NaN,甚至可以在if之外使用。