NaN
和Infinity
之间有什么区别? NaN
何时出现?它是什么?
答案 0 :(得分:26)
来自Wikipedia:
在计算中,NaN(非数字)是表示未定义或不可表示值的数值数据类型的值,尤其是在浮点计算中。 1985年,IEEE 754浮点标准引入了NaNs的系统使用,以及其他非有限量的表示,如无穷大。
来自MSDN:
表示不是数字(NaN)的值。该字段是常量。
此常量的值是将零除零的结果。
当操作结果未定义时,将返回此常量。
使用IsNaN确定值是否不是数字。通过将值与另一个等于NaN的值进行比较,无法确定某个值是否为数字。
Infinity
(positive infinity和negative infinity)的结果是导致溢出的浮点运算的结果(例如3.0 / 0
)。
答案 1 :(得分:10)
Infinity
是一个数学结构:
例如,在欧几里德空间中,通过零元素的划分(在这种情况下为零)应该产生无穷大:
1 / 0 = Infinity
Not a Number
或NaN
是一个计算构造,伴随着解析器和编程限制,根据函数可以为其输出赋予不同的含义有问题。
例如,结果可能只能在数学上使用不同的数字系统来处理,这对于数学家来说很容易,但在你的函数中你可能会被留作唯一的实用选项来返回NaN
。考虑一下-1
的平方根:
sqrt(-1) = NaN
...在complex
和phase space
中易于处理的操作。
<强>实验强>:
在浏览器中打开JavaScript.Console(CTRL + SHIFT + J),然后输入
>>> Math.sqrt(-1)
NaN
>>> 1/0
Infinity
>>> Number.MAX_VALUE
1.7976931348623157e+308
>>> Number.MAX_VALUE *2
Infinity
>>> parseFloat("I am not a Number")
NaN
在C#中,典型的“NaN情境”主要通过例外处理:
csharp> Int64.MaxValue;
9223372036854775807
csharp> Int64 i_64 = Int64.MaxValue;
//the number will overflow into the sign-bit
csharp> i_64 +=1;
//...or similarly with Doubles...
csharp> Double.MaxValue;
1.79769313486232E+308
//following, an exception is thrown before overflowing
csharp> Int64 i_64 = Int64.MaxValue+1;
{interactive}(1,29): error CS0220: The operation overflows at compile time in ch
ecked mode
动态类型语言:
总的来说,NaN
的使用在不同的编程语言中有一定程度的灵活分配。在失去一些“上下文信息”时使用NaN
在动态类型脚本语言中很方便,程序员通常不想打扰复杂的异常类型并对其进行处理。
答案 2 :(得分:4)
通常在0除以0时发生。在此处阅读更多内容:http://msdn.microsoft.com/en-us/library/system.double.nan.aspx
答案 3 :(得分:1)
NaN代表“非数字值”。为避免异常,您可以使用IsNaN来确定某个值不是数字。
答案 4 :(得分:1)
NaN表示“非数字”,并告诉您double类型的此变量没有任何值。
答案 5 :(得分:0)
检查double是否有值,如果没有,则返回0
if (double.Equals(double.NaN, myValue))
myValue= 0;