zoukankan      html  css  js  c++  java
  • 老鼠, 老虎傻傻分不清楚之Double.NaN

        如果看到这段代码,客官您认为会输出什么?

        

    static void Main(string[] args)
            {
    
                double tmpValue=double.NaN;
                if(tmpValue==double.NaN)
                {
                    Console.WriteLine("这是正常输出?");
                }
                else
                {
                    Console.WriteLine("这是神马情况?");
                }
              
                Console.Read();
            }

      如果是"这是正常输出?",恭喜您!     可以去面壁了!

       哈哈,不过玩数据库的同学都知道这个东西看上去会感觉不对劲,但是也不好说是哪里不对。

         其实结果是:

         

         下面详细说一下:

    public const double NaN = 0.0 / 0.0;

    表示不是数字 (NaN) 的值。 此字段为常数。

      有的同学会说我知道了,因为NaN的值是0.0/0.0,那么写成这个样子输出是什么呢?

         

      double tmpValue = double.NaN;
                if ((0.0/0.0) == double.NaN)
                {
                    Console.WriteLine("这是正常输出?");
                }
                else
                {
                    Console.WriteLine("这是神马情况?");
                }

       其实结果是和上面一样的。MSDN上的游戏法则:

       当未定义算术运算时,Double.NaN 表示非数字结果。 测试一个值与 Double.NaN 之间的相等关系的任何表达式始终返回 false。 测试一个值与 Double.NaN 之间的不等关系的任何表达式始终返回 true。

    如何解决冲突。若要修复与此规则的冲突并准确确定某个值是否表示 Double.NaN,请使用 Single.IsNan 或 Double.IsNan 来测试值。

         翻开Double类的源代码会发现:

           

    [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)]
            public static bool IsNaN(double d) 
            { 
                //Jit will generate inlineable code with this
    // warning CS1718: comparison to same variable 
    #pragma warning disable 1718
                if (d != d)
                {
                    return true; 
                }
                else 
                { 
                    return false;
                } 
    #pragma warning restore 1718
            }

             至于:ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)是什么意思,请大家参阅MSDN。至于数据库的Null判断也是is null 不要搞错了哦,否则坑太深不容易出来 。^_^

          另这个扩展阅读(这个Attribute在Object类中的作用)

          http://kb.cnblogs.com/page/69614/

  • 相关阅读:
    hdu4331 Image Recognition 就暴力啊。。啊。。
    [置顶] ASP.Net中服务器控件的生命周期
    Windows下通过脚本快速修改IP地址
    java对象转json应clone,避免生成json串有问题
    Oracle表空间常用操作
    redhat5安装jdk6、eclipse和tomcat6
    Oracle 表的常见操作
    一道来自华为的C机试题目
    [置顶] 获取系统时间的方法--linux
    html5 命运之轮生产
  • 原文地址:https://www.cnblogs.com/wangn/p/3612923.html
Copyright © 2011-2022 走看看