6

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

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

if (!Double.IsNaN(myDouble))

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

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

4

5 回答 5

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.
}
于 2012-11-28T03:29:38.367 回答
3

你也可以使用

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

如果最里面的括号中的值是非空的myDouble(去掉了它的包装),或者只是如果是。Se运算符 (C#)Nullable<>0.0myDoublenull??

于 2012-12-11T22:32:40.447 回答
0

我有同样的问题,我通过铸造双打解决了它?带双

double.IsNaN((double)myDouble)

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

于 2015-03-25T03:45:53.003 回答
0

使用 C# 7.0模式匹配组合 null + NaN 检查检查可以这样写:

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

优点是val手头的局部范围变量,它不是null,也不是,double.NaN甚至可以在if.

于 2020-11-18T13:40:03.977 回答
0

较新的 Roslyn C# 版本中使用模式匹配,double.NaN是一种有效的模式,可以使用IsNaN(即它的工作方式不同于IEEE 浮点标准所指定的Equals()where NaNis never equal )。NaN

因此,您现在可以这样做:

double? myDouble = something;
if (myDouble is double and not double.NaN)
   Console.WriteLine("A number");

为了测试NaN,甚至可以这样缩短:

double? myDouble = something;
if (myDouble is double.NaN)
   Console.WriteLine("Not a number and not NULL");
于 2021-10-13T16:19:03.123 回答