double이 NaN과 같은지 어떻게 테스트합니까?


283

Java에 이중이 있고 그것이 있는지 확인하고 싶습니다 NaN. 가장 좋은 방법은 무엇입니까?

답변:


475

정적의 사용 Double.isNaN(double)방법, 또는 당신 Double.isNaN()방법을.

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

단순히하기 :

if (var == Double.NaN) {
    ...
}

이다 충분하지 어떻게 '로 인해 NaN를위한 IEEE 표준 및 부동 소수점 숫자가 정의됩니다.


51
이를 수행하는 또 다른 방법은 v! = v입니다. NaN 만 false와 자체를 비교합니다. 그러나 isNaN은 백만 배 더 좋습니다. :)
Joren September

5
@Joren, 결코 늦지 않는 것이 낫다 : 'isNaN'은 가독성을 위해 v! = v보다 실제로 사용하는 것이 좋습니다. 그러나 isNaN 메소드의 소스 코드는 v! = v를 말하는 것과 동일합니다. 소스 : static public boolean isNaN (double v) {return (v! = v); }
Rolf ツ

1
Double.isNaN should be (true) 좋은 답변
올리버 쇼

@Joren isNaN 그냥 v! = v;) 확인하지만 더 좋아 보인다
Mr Jedi

Java 5를 사용하면 value == Double.NaN작동하지 않지만 정상적으로 작동 Double.isNaN(value)합니다.
zero01alpha

45

시도 Double.isNaN():

이 Double 값이 NaN (Not-a-Number)이면 true를, 그렇지 않으면 false를 반환합니다.

double.isNaN()박스가없는 복식에는 연관된 방법이 없기 때문에 [ ]가 작동하지 않습니다.


Java에서 기본 유형에 대한 메소드를 호출 할 수 없다고 생각했습니다. 정말되어야 Double.isNan()하고 그렇지 double.IsNan()않습니까?
Joren September

Joren, 그는 오토 박싱에 의존하고 있습니다 (컴파일러 / 런타임에 의해 Double은 Double로 변환됩니다). 1.5 이후의 새로운 기능. 이 방향으로 갈 위험은 거의 없습니다. Double에서 Double로 이동하면 NullPointerException이 발생할 위험이 있습니다.
M1EK

autoboxing은 double을 인수로 사용하고 컬렉션에 추가하는 등의 작업에만 효과가 있다고 생각했습니다. 이중 x를 선언하고 x를 isNaN ()에 요청하십시오-컴파일러 오류가 발생합니다.
Carl

Andrew가 첫 번째 "double"을 입력하는 Shift 키를 놓친 것 같습니다.
Carl

14

via를 통해 값이 유한한지 확인하는 것이 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)

10

를 사용하여 NaN을 확인할 수 있습니다 var != var. NaN같지 않습니다 NaN.

편집 : 이것은 아마도 최악의 방법 일 것입니다. 혼란스럽고 가독성이 좋지 않으며 전반적인 나쁜 습관입니다.


3
누군가가 공감대를 설명 할 수 있습니까? 이 방법은 매우 나쁘고 isNan가독성이 더 좋지만 작동합니다. 그리고 isNan메소드는 이것을 사용하여 확인합니다 NaN.
HyperNeutrino

1
이 방법은 매우 나쁘고 isNaN이 가독성에 더 좋기 때문에 downvote가 추측되었습니다.
Edward Falk

1
난 당신을 downvote하지 않았지만 여기에 추가 의견이 도움이 될 것이라고 생각합니다 : Float 또는 Double과 같은 래퍼를 비교하면 값이 아닌이 방법으로 참조를 비교하게됩니다. 원하는 값이 아닙니다.
Battle_Slug

3
@Battle_Slug 댓글 주셔서 감사합니다. 나는 이것이 매우 나쁜 아이디어라는 것을 알고 있지만, 나는 그것을 완전성을 위해 여기에 두었습니다.
HyperNeutrino

isNaN이것은 후드 아래에서 작동하지만 어떻게 작동합니까? 무언가가 어떻게 다른가요?
wilmol

0

초보자에게는 실제적인 예가 필요합니다. 다음 코드를 시도하십시오.

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
이 예제는 너무 많은 일을 보여 주려고했지만 명확하지 않습니다. 이것은 단지 조각난 코드입니다.
Jared Hooper

3
'09 년에이 질문을 다시 받았을 때 초보자였던 OP로서, "답변적인"예보다 훨씬 더 도움이되었다는 것을 확신 할 수 있습니다.
Eric Wilson

이 예제 코드를 게시 해 주셔서 감사합니다 @pggajendra babu.
datnt

0

아래 코드 스 니펫은 NaN을 보유하는 기본 유형을 평가하는 데 도움이됩니다.

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.