자바에서 double이 있는데, NaN
인지 확인하고 싶습니다. 이 작업을 수행하는 가장 좋은 방법은 무엇입니까?double이 NaN과 같은지 어떻게 테스트합니까?
답변
정적 인 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이 정의 된 방법에 의한.
는 Double.isNaN()
을 시도해보십시오
반환 사실이 Double 값이 비수 (NaN), 그렇지 않은 경우는 false 인 경우.
[double.isNaN()
]는 상자에 넣지 않은 복식에 연결된 메서드가 없으므로 작동하지 않습니다.
Java의 기본 유형에 대한 메소드를 호출 할 수 없다고 생각했습니다. 정말 double.isNan()이 아니라'Double.isNan()'이어야합니다. 맞습니까? – Joren
Joren, 그는 autoboxing (double은 컴파일러/런타임에 의해 Double으로 변환 됨)에 의존합니다. 1.5 이후의 새로운 기능. 이 방향으로 가고있는 작은 위험; Double에서 Double로 이동하면 NullPointerExceptions의 위험이 발생합니다. – M1EK
autoboxing은 double을 인자로 사용하고, 콜렉션에 추가하는 등의 작업에만 작용한다고 생각했습니다. double x를 선언 한 다음 x에 isNaN()을 요구하면 컴파일러 오류가 발생합니다. – Carl
실용적인 예제가 필요합니다. 다음 코드를 시도하십시오.
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
이 예제는 너무 많아 보여 주려고하는 것이 명확하지 않습니다. 이것은 단편적인 코드 일뿐입니다. –
이 질문이 '09 년에 물었을 때 초보자 인 OP로서, 나는이 "실용적인"예가 있었을 때보 다 수용된 대답이 훨씬 더 도움이된다는 것을 확신 할 수 있습니다. –
이 예제 코드를 게시 해 주신 @ p.g.gajendra babu에게 감사드립니다. – datnt
var != var
을 사용하여 NaN을 확인할 수 있습니다. NaN
은 NaN
과 동일하지 않습니다.
편집 : 이것은 아마도 최악의 방법 일 것입니다. 가독성 및 전반적인 나쁜 습관에 대해 혼란스럽고 끔찍합니다.
누군가 downvote를 설명 할 수 있습니까? 이 방법은 매우 나쁘며 'isNan'은 가독성을 위해 더 좋지만 작동합니까? 그리고 isNan 메서드는 이것을 사용하여 NaN을 검사합니다. – HyperNeutrino
이 방법은 매우 나쁘고 isNaN은 가독성을 높이기 때문에 downvote를 추측했습니다. –
나는 당신을 downvote하지 않았지만 추가 코멘트가 유용 할 것이라고 생각합니다. Float 또는 Double과 같은 래퍼를 비교하면이 값은 아니고 참조를이 방식과 비교하게됩니다. 이는 분명히 원하는 것이 아닙니다. –
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)
이렇게하는 또 다른 방법은 v! = v입니다. NaN만이 false를 자체와 비교합니다. 그래도 isNaN은 백만 배나 더 좋습니다. :) – Joren
이것은 나를 위해 작동하지 않았다. Double.isNaN (var)은 – fiacobelli
@Joren을 사용했지만 결코 늦지 않는 것이 좋습니다. 'isNaN'은 가독성을 위해 v! = v보다 사용하는 것이 좋습니다. 그러나 isNaN 메서드의 소스 코드는 v! = v.와 (과) 정확히 동일합니다. 소스 : 정적 public boolean isNaN (double v) { return (v! = v); } –