Double.NaN的等价性

37

我有以下代码...

if (Price_Foreign != Double.NaN)
{
   output.Append(spacer);
   output.Append(String.Format("{0,-10:C} USD",Price_Foreign));
}

输出结果为:

NaN USD

是什么问题呢?

我正在使用Double.NaN来表示值不存在,不应该被输出。

5个回答

64

也许你正在寻找IsNaN静态函数?

尝试像这样:

if (!Double.IsNaN(Price_Foreign))
{
   output.Append(spacer);
   output.Append(String.Format("{0,-10:C} USD",Price_Foreign));
}

“is NaN” 在 C#7 模式匹配中对于 (xxx is Double.NaN) 的测试是否正确? - CodingNinja

39

IEEE 754浮点标准规定,将NaN与NaN进行比较将始终返回false。如果您必须这样做,请使用Double.IsNaN()

但是,这不是您尝试完成任务的最佳方法。Double类型并不精确,并且您在此处使用它们来表示价格。我打赌您最终会想要比较价格是否相等。这不起作用,因为您不能依赖浮点数的相等性

您应该真正考虑使用一些整数类型来表示这些值(支持相等性比较),而不是尝试使用Double类型。Double类型适用于科学问题,而不适用于财务问题。


我被困在多年前的现有数据库中。 - Chris Cudmore

10

Double.NaN 不等于任何东西,甚至不等于它自己。

请参见 .NET Framework 类库文档中的 Double.NaN 字段

使用 IsNaN 来确定一个值是否为非数字。无法通过将其与等于 NaN 的另一个值进行比较来确定一个值是否为非数字。


4
除非您使用.Equals方法! - NetMage

8
作为背景信息: IsNaN() 方法的作用是返回 v != v;

2
不。请参考参考来源 - Wizou
我测试了一下:IsNaN()函数确实有效,而比较操作则无效。 - undefined
再次测试一下,或者证明一下。 - undefined

0
如果你像我一样懒,你可以使用下面的扩展方法:
[MethodImpl( MethodImplOptions.AggressiveInlining )]
public static bool IsNaN( this System.Single v ) {
    return System.Single.IsNaN( v );
}

你需要另一个用于 System.Double 的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接