2009-09-21 6 views

답변

386

정적 인 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이 정의 된 방법에 의한.

+44

이렇게하는 또 다른 방법은 v! = v입니다. NaN만이 false를 자체와 비교합니다. 그래도 isNaN은 백만 배나 더 좋습니다. :) – Joren

+8

이것은 나를 위해 작동하지 않았다. Double.isNaN (var)은 – fiacobelli

+3

@Joren을 사용했지만 결코 늦지 않는 것이 좋습니다. 'isNaN'은 가독성을 위해 v! = v보다 사용하는 것이 좋습니다. 그러나 isNaN 메서드의 소스 코드는 v! = v.와 (과) 정확히 동일합니다. 소스 : 정적 public boolean isNaN (double v) { return (v! = v); } –

42

Double.isNaN()을 시도해보십시오

반환 사실이 Double 값이 비수 (NaN), 그렇지 않은 경우는 false 인 경우.

[double.isNaN()]는 상자에 넣지 않은 복식에 연결된 메서드가 없으므로 작동하지 않습니다.

+0

Java의 기본 유형에 대한 메소드를 호출 할 수 없다고 생각했습니다. 정말 double.isNan()이 아니라'Double.isNan()'이어야합니다. 맞습니까? – Joren

+0

Joren, 그는 autoboxing (double은 컴파일러/런타임에 의해 Double으로 변환 됨)에 의존합니다. 1.5 이후의 새로운 기능. 이 방향으로 가고있는 작은 위험; Double에서 Double로 이동하면 NullPointerExceptions의 위험이 발생합니다. – M1EK

+0

autoboxing은 double을 인자로 사용하고, 콜렉션에 추가하는 등의 작업에만 작용한다고 생각했습니다. double x를 선언 한 다음 x에 isNaN()을 요구하면 컴파일러 오류가 발생합니다. – Carl

-2

실용적인 예제가 필요합니다. 다음 코드를 시도하십시오.

public class Not_a_Number { 

public static void main(String[] args) { 
    // TODO Auto-generated method stub 

    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 
+2

이 예제는 너무 많아 보여 주려고하는 것이 명확하지 않습니다. 이것은 단편적인 코드 일뿐입니다. –

+2

이 질문이 '09 년에 물었을 때 초보자 인 OP로서, 나는이 "실용적인"예가 있었을 때보 다 수용된 대답이 훨씬 더 도움이된다는 것을 확신 할 수 있습니다. –

+0

이 예제 코드를 게시 해 주신 @ p.g.gajendra babu에게 감사드립니다. – datnt

10

var != var을 사용하여 NaN을 확인할 수 있습니다. NaNNaN과 동일하지 않습니다.

편집 : 이것은 아마도 최악의 방법 일 것입니다. 가독성 및 전반적인 나쁜 습관에 대해 혼란스럽고 끔찍합니다.

+2

누군가 downvote를 설명 할 수 있습니까? 이 방법은 매우 나쁘며 'isNan'은 가독성을 위해 더 좋지만 작동합니까? 그리고 isNan 메서드는 이것을 사용하여 NaN을 검사합니다. – HyperNeutrino

+1

이 방법은 매우 나쁘고 isNaN은 가독성을 높이기 때문에 downvote를 추측했습니다. –

+0

나는 당신을 downvote하지 않았지만 추가 코멘트가 유용 할 것이라고 생각합니다. Float 또는 Double과 같은 래퍼를 비교하면이 값은 아니고 참조를이 방식과 비교하게됩니다. 이는 분명히 원하는 것이 아닙니다. –

7

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)