c# - 将 Double.NaN 与自身进行比较

标签 c# .net double nan

我一直在试图找出为什么这两个操作返回不同的值:

  1. Double.NaN == Double.NaN 返回 false
  2. Double.NaN.Equals(Double.NaN) 返回 true

我有 answer到第一部分而不是第二部分而不是“为什么这两个比较返回不同的值”

最佳答案

差异的原因很简单,即使不是很明显。

如果使用相等运算符 == ,那么您正在使用 IEEE 测试是否相等。

如果您使用的是 Equals(object)方法,那么你必须维护object.Equals(object)的合约.当您实现此方法(以及相应的 GetHashCode 方法)时,您必须维护该契约,这与 IEEE 行为不同。

如果Equals合约没有得到维护,那么哈希表的行为就会崩溃。

var map = new Dictionary<double,string>();
map[double.NaN] = "NaN";
var s = map[double.NaN];

如果!double.NaN.Equals(double.NaN) ,你永远无法从字典中找到你的值(value)!

如果前面的句子没有意义,那么请理解哈希机制(用于 Dictionary<T,U>HashSet<T> 等)同时使用 object.Equals(object)object.GetHashCode()广泛的方法,并依赖于对其行为的保证。

关于c# - 将 Double.NaN 与自身进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14458890/

相关文章:

C#加载文件所花费的时间

.net - 通过 SSL 到 .NET 客户端的 ActiveMQ

c# - x 深度的所有文件夹和文件的列表

swift - 无法将类型 '[String]?' 的值转换为预期的参数类型 'String' Swift

c# - 如何从项目文件夹中确定团队项目 URI

c# - 无法向 Google 电子表格添加行

c# - 仅在一个类中设置泛型类型

.net - 在不需要的地方运行 dotnet 的 Rider 中的 Docker-compose

javascript - leaflet.js WMS 图层缩放在双击时不起作用

c# - 如何分离 double 和字符串项,出现无效的转换错误