为什么double.NaN不等于自己?

Car*_*rlo 81 .net c#

谁可以给我解释一下这个?在C#中,double.NaN不等于double.NaN

bool huh = double.NaN == double.NaN; // huh = false
bool huh2 = double.NaN >= 0; // huh2 = false
bool huh3 = double.NaN <= 0; // huh3 = false
Run Code Online (Sandbox Code Playgroud)

我可以将什么常数与double.NaN相比并得到真实?

Eri*_*bal 130

如果你很好奇,这是Double.IsNaN看起来像:

public static bool IsNaN(double d)
{
    return (d != d);
}
Run Code Online (Sandbox Code Playgroud)

时髦,是吧?

  • 这很奇怪.但是再说一遍,NaN的声明也是如此:`public const double NaN =(double)1.0 /(double)0.0;` (11认同)
  • @Fredik,@ Erich:除以零将给出inf(或者,+ inf,基于操作数的-inf),0/0(等等)得到NaN.在http://steve.hollasch.net/cgindex/coding/ieeefloat.html上有一个很好的表格,其中包含特殊操作/结果 (5认同)
  • 为了增加混淆,object.Equals(double.NaN,double.NaN)返回true (5认同)
  • @JimBalter 你是对的,我的评论是错误的:参考源实际上是在说`public const double NaN = (double)0.0 / (double)0.0;` [链接到参考源](http://referencesource.microsoft. com/#mscorlib/system/double.cs#dcd7a869fad1e6bb)。感谢您指出了这一点。另一方面:犯错和撒谎是两件完全不同的事情 (3认同)
  • 不确定您发布时这是否正确,但是今天 IsNaN [定义不同](https://github.com/dotnet/coreclr/blob/ef1e2ab328087c61a6878c1e84f4fc5d710aebce/src/mscorlib/src/System/Double.cs#L92) . (2认同)

Fra*_* B. 16

bool isNaN = Double.IsNaN(yourNumber)
Run Code Online (Sandbox Code Playgroud)


Mik*_*scu 10

这种行为是故意的.原因是NaN代表的不是一个数字,因此对许多事情来说都是一种全能.

将某些东西与NaN进行比较的正确方法是使用IsNaN函数.


Col*_*kay 7

使用Double.IsNan()来测试相等性.原因是NaN不是一个数字.


aru*_*rul 6

这有一个专门的功能:

double.IsNan(huh);
Run Code Online (Sandbox Code Playgroud)


Dav*_*vid 5

使用方法"Double.IsNaN(value)"检查此条件.