【问题标题】:How do you test to see if a double is equal to NaN?你如何测试一个双精度数是否等于 NaN?
【发布时间】:2010-11-30 04:54:54
【问题描述】:

我在 Java 中有一个 double,我想检查它是否是 NaN。 最好的方法是什么?

【问题讨论】:

    标签: java double equality nan


    【解决方案1】:

    初学者需要实例。所以试试下面的代码。

    public class Not_a_Number {
    
    public static void main(String[] args) {
        String message = "0.0/0.0 is NaN.\nsimilarly Math.sqrt(-1) is NaN.";        
        String dottedLine = "------------------------------------------------";     
    
        Double numerator = -2.0;
        Double denominator = -2.0;      
        while (denominator <= 1) {
            Double x = numerator/denominator;           
            Double y = new Double (x);
            boolean z = y.isNaN();
            System.out.println("y =  " + y);
            System.out.println("z =  " + z);
            if (z == true){
                System.out.println(message);                
            }
            else {
                System.out.println("Hi, everyone"); 
            }
            numerator = numerator + 1;
            denominator = denominator +1;
            System.out.println(dottedLine);         
        } // end of while
    
    } // end of main
    
    } // end of class
    

    【讨论】:

    • 这个例子做的太多了,不清楚你想展示什么。这只是一堆零散的代码。
    • 作为 09 年被问到这个问题时还是初学者的 OP,我可以向您保证,接受的答案比这个“实际”示例更有帮助。跨度>
    • 感谢@p.g.gajendra babu 发布此示例代码。
    【解决方案2】:

    如果您的测试值是 Double(不是原始值)并且可能是 null(显然也不是数字),那么您应该使用以下术语:

    (value==null || Double.isNaN(value))

    由于isNaN() 想要一个原语(而不是将任何原语 double 装箱为 Double),因此传递了 null 值(不能将其拆箱为 Double em>) 将导致异常而不是预期的false

    【讨论】:

      【解决方案3】:

      下面的代码 sn-p 将帮助评估持有 NaN 的原始类型。

      double dbl = Double.NaN; Double.valueOf(dbl).isNaN() ? true : false;

      【讨论】:

        【解决方案4】:

        使用静态Double.isNaN(double) 方法,或您的Double.isNaN() 方法。

        // 1. static method
        if (Double.isNaN(doubleValue)) {
            ...
        }
        // 2. object's method
        if (doubleObject.isNaN()) {
            ...
        }
        

        简单地做:

        if (var == Double.NaN) {
            ...
        }
        
        由于IEEE standard for NaN and floating point numbers 的定义方式,

        不够

        【讨论】:

        • 另一种方法是 v != v。只有 NaN 将 false 与自身进行比较。但是不要那样做,isNaN 要好一百万倍。 :)
        • @Joren,迟到总比没有好:'isNaN' 确实比 v != v 更好用,以提高可读性。但是isNaN方法的源码和说v != v一模一样。来源:static public boolean isNaN(double v) { return (v != v); }
        • Double.isNaN should be (true) 不错的答案
        • @Joren isNaN 只需检查 v != v ;) 但它看起来更好
        • 使用 Java 5:value == Double.NaN 不起作用,但 Double.isNaN(value) 工作正常。
        【解决方案5】:

        您可以使用 var != var 检查 NaN。 NaN 不等于 NaN

        编辑:这可能是迄今为止最糟糕的方法。这令人困惑,可读性差,而且总体上是不好的做法。

        【讨论】:

        • 有人能解释一下否决票吗?我知道,这种方式很糟糕,isNan 的可读性更好,但它确实有效,对吧?而isNan 方法使用它来检查NaN
        • 我猜是因为这种方式非常糟糕,而 isNaN 的可读性更好。
        • 我没有对你投反对票,但我认为额外的评论在这里会很有用:如果你比较像 Float 或 Double 这样的包装器,你最终会以这种方式比较引用,而不是它们的值,这绝对不是你想要什么。
        • @Battle_Slug 感谢您的评论。我知道这是一个非常糟糕的主意,但为了完整起见,我把它放在这里。
        • isNaN 在后台执行此操作,但它是如何工作的?东西怎么不等于自己??
        【解决方案6】:

        您可能还需要考虑通过Double.isFinite(value) 检查值是否有限。从 Java 8 开始,Double 类中有一个新方法,您可以在其中立即检查值是否不是 NaN 和无穷大。

        /**
         * Returns {@code true} if the argument is a finite floating-point
         * value; returns {@code false} otherwise (for NaN and infinity
         * arguments).
         *
         * @param d the {@code double} value to be tested
         * @return {@code true} if the argument is a finite
         * floating-point value, {@code false} otherwise.
         * @since 1.8
         */
        public static boolean isFinite(double d)
        

        【讨论】:

          【解决方案7】:

          试试Double.isNaN():

          如果此 Double 值是非数字 (NaN),则返回 true,否则返回 false。

          请注意,[double.isNaN()] 将不起作用,因为未装箱的双精度没有与之关联的方法。

          【讨论】:

          • 我以为你不能在 Java 中调用原始类型的方法。它真的需要是Double.isNan() 而不是double.IsNan(),对吧?
          • Joren,他依赖自动装箱(编译器/运行时将 double 转换为 Double);从 1.5 开始的新功能。朝这个方向发展的风险很小;从 Double 到 double 会产生 NullPointerExceptions 的风险。
          • 我认为自动装箱仅适用于使用 double 作为参数,将其添加到集合等。尝试声明 double x 然后询问 x 到 isNaN() - 给我一个编译器错误。
          • 真的,我怀疑 Andrew 只是错过了键入第一个“double”的 shift 键。
          猜你喜欢
          • 1970-01-01
          • 2019-05-01
          • 2010-10-27
          • 1970-01-01
          • 1970-01-01
          • 2013-02-11
          • 2011-10-22
          • 2017-02-05
          • 2022-01-11
          相关资源
          最近更新 更多