我有2个可以为空的双打,一个期望值和一个实际值(让我们称它们为value和valueExpected)。使用100 *(value / valueExpected)找到百分比。但是,如果valueExpected为零,则返回NaN。到目前为止一切都很好。
现在,如果我需要检查值,看看它是否是NaN,我该怎么办?通常可以使用:
if (!Double.IsNaN(myDouble))
但这不适用于可空值(IsNaN仅适用于非可空变量)。我已经更改了我的代码来进行检查(valueExpected == 0),但我仍然很好奇 - 有没有办法检查可以为空的NaN?
编辑:当我说代码不起作用时,我的意思是它不会编译。首先测试null不起作用。
答案 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
如果myDouble
是null
。 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
之外使用。