以Double.IsNaN()
为参数调用Double.PositiveInfinity
时,结果为false。这是违背我的直觉的,因为无穷大不是一个数字。显然" NaN"仅存在于.NET中的常量,是由IEEE标准描述还是自定义实现细节?是否有更短的方法来检查Double
是否是" NaN"比:
(Double.IsNaN(d) || Double.IsPositiveInfinity(d) || Double.IsNegativeInfinity(d))
或
(Double.IsNaN(d) || Double.IsInfinity(d))
答案 0 :(得分:49)
正如MSDN所说,NaN意味着结果未定义。无穷大的结果定义如下:
当操作结果为时,方法或运算符返回NaN 未定义。例如,将零除零的结果是NaN,as 以下示例显示。 (但请注意除以非零数字 由零返回PositiveInfinity或NegativeInfinity,具体取决于 在除数的标志上。)
因此,将无限性视为NaN并不是一个好主意。您可以编写扩展方法来检查值是否不是NaN或无穷大:
// Or IsNanOrInfinity
public static bool HasValue(this double value)
{
return !Double.IsNaN(value) && !Double.IsInfinity(value);
}
答案 1 :(得分:2)
Double
类型中有三个特殊值,它基于IEEE standard 754。一个是正无穷大,另一个是负无穷大,最后一个是非数字(NaN)。 Double.IsNaN
方法所做的就是检查变量中的值是否是这个特殊的NaN值。
答案 2 :(得分:2)
您不再需要SergeyBerezovskiy答案的扩展名。
double
具有IsFinite()
方法来检查双精度数是否为有限数(不是NaN
还是Infinity
):
double.IsFinite(d)
请参见.Net Framework和.Net Core中的源代码
答案 3 :(得分:0)
如果您希望double
的值始终是数字,则可以使用此FiniteOrDefault
扩展名。当然,它的灵感来自Sergey Berezovskiy's answer。
public static bool HasValue(this double value)
{
return !double.IsNaN(value) && !double.IsInfinity(value);
}
/// <summary>
/// Returns zero when double is NaN or Infinte
/// </summary>
public static double FiniteOrDefault(this double value)
{
return value.HasValue() ? value : default;
}
有了它,下面的代码将更具可读性:
Rect dimensions = new Rect
{
X = Canvas.GetLeft(Control).FiniteOrDefault(),
Y = Canvas.GetTop(Control).FiniteOrDefault(),
Width = Control.ActualWidth.FiniteOrDefault(),
Height = Control.ActualHeight.FiniteOrDefault()
};