专栏首页黄腾霄的博客小心double的比较

小心double的比较

对于double的比较,存在一些可能的坑,大家应该都清楚。比如容易注意的是double==double的精度问题。但是比较少注意的是double.NaN的比较


我们先看一个demo

public static void Main()
   {
      Console.WriteLine("NaN == NaN: {0}", Double.NaN == Double.NaN); 
      Console.WriteLine("NaN != NaN: {0}", Double.NaN != Double.NaN); 
      Console.WriteLine("NaN.Equals(NaN): {0}", Double.NaN.Equals(Double.NaN)); 
      Console.WriteLine("! NaN.Equals(NaN): {0}", ! Double.NaN.Equals(Double.NaN)); 
      Console.WriteLine("IsNaN: {0}", Double.IsNaN(Double.NaN));

      Console.WriteLine("\nNaN > NaN: {0}", Double.NaN > Double.NaN); 
      Console.WriteLine("NaN >= NaN: {0}", Double.NaN >= Double.NaN); 
      Console.WriteLine("NaN < NaN: {0}", Double.NaN < Double.NaN);
      Console.WriteLine("NaN < 100.0: {0}", Double.NaN < 100.0); 
      Console.WriteLine("NaN <= 100.0: {0}", Double.NaN <= 100.0); 
      Console.WriteLine("NaN >= 100.0: {0}", Double.NaN > 100.0);
      Console.WriteLine("NaN.CompareTo(NaN): {0}", Double.NaN.CompareTo(Double.NaN)); 
      Console.WriteLine("NaN.CompareTo(100.0): {0}", Double.NaN.CompareTo(100.0)); 
      Console.WriteLine("(100.0).CompareTo(Double.NaN): {0}", (100.0).CompareTo(Double.NaN)); 
   }

他的输出结果如下

NaN == NaN: False
NaN != NaN: True
NaN.Equals(NaN): True
! NaN.Equals(NaN): False
IsNaN: True

NaN > NaN: False
NaN >= NaN: False
NaN < NaN: False
NaN < 100.0: False
NaN <= 100.0: False
NaN >= 100.0: False
NaN.CompareTo(NaN): 0
NaN.CompareTo(100.0): -1
(100.0).CompareTo(Double.NaN): 1

我们可以看到,在相等性上,NaN!=NaN,但是可以使用NaN.Equals(NaN)判断相等性

而在<>符号比较上NaN都是返回false,使用CompareTo方法与其他double比较时,NaN都是返回-1

微软的考虑是NaN不是一个数值,因此不能参与数值比较(比如NaN+1=NaN,那么前后的NaN是否相等呢?)。

而方法的比较是为了满足如IComparable<double>接口的需要,便于排序等操作的使用

所以说有什么代码推荐呢?

  • 涉及可能会出现NaN的情况,需要使用double.IsNaN进行判断
  • 涉及double的比较判断,建议使用True条件。 如判断a是否是正数,使用 result=a>0?a:1 而不使用 result=a<=0?1:a

参考链接:


本文会经常更新,请阅读原文: https://xinyuehtx.github.io/post/%E5%B0%8F%E5%BF%83double%E7%9A%84%E6%AF%94%E8%BE%83.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。

本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名黄腾霄(包含链接: https://xinyuehtx.github.io ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 2020-6-10-node版本管理工具NVM-windows介绍及原理

    本文会经常更新,请阅读原文: https://xinyuehtx.github.io/post/node%E7%89%88%E6%9C%AC%E7%AE%A1%...

    黄腾霄
  • 关于git pull或fetch失败

    本文会经常更新,请阅读原文: https://xinyuehtx.github.io/post/%E5%85%B3%E4%BA%8Egit-pull%E6%88...

    黄腾霄
  • 2019-5-30-UML用例图

    UML用例图(Use Case Diagrams)是一种描述用户和系统之间交互的简单表达方式。它描述了特定系统(主体)同外部用户(角色)之间的一系列交互行为(用...

    黄腾霄
  • pandas中ix的使用详细讲解

    在上一篇博客中,我们已经仔细讲解了iloc和loc,只是简单了提到了ix。这是因为相比于前2者,ix更复杂,也更让人迷惑。

    砸漏
  • 【机器学习实战】第13章 利用 PCA 来简化数据

    第13章 利用 PCA 来简化数据 ? 降维技术 场景 我们正通过电视观看体育比赛,在电视的显示器上有一个球。 显示器大概包含了100万像素点,而球则可能...

    片刻
  • Under the Hood: NaN of JS

    如果你还不确定这两题的答案的话,请仔细阅读本文。 这两题的答案不会直接解释,请从文章中寻找答案。

    有赞coder
  • AkShare-期货数据-仓单日报

    目标地址: http://www.czce.com.cn/cn/jysj/cdrb/H770310index_1.htm

    AkShare
  • JavaScript 中的 NaN

    另外还有 2 个特殊的数字值:Infinity(比其他任何数字都大的数字)和 NaN(表示“Not A Number”概念):

    疯狂的技术宅
  • AkShare-能源数据-碳排放-国际行情

    目标地址: http://www.cerx.cn/dailynewsOuter/index.htm

    AkShare
  • javascript 红皮高程(7)

    javascript的数值表示,真是。。 这还有个NaN,非数值(Not a Number),就是不是数字。然后已是书里写着,是一个特殊的数值。 这让小学文化的...

    web前端教室

扫码关注云+社区

领取腾讯云代金券