Mam podwójne w Javie i chcę sprawdzić, czy jest to NaN
. Jaki jest najlepszy sposób na zrobienie tego?Jak sprawdzić, czy podwójne jest równe NaN?
Odpowiedz
Użyj metody statycznej: Double.isNaN(double)
lub metody Double
'.isNaN()
.
// 1. static method
if (Double.isNaN(doubleValue)) {
...
}
// 2. object's method
if (doubleObject.isNan()) {
...
}
prostu robi:
if (var == Double.NaN) {
...
}
jest nie wystarcza powodu jak IEEE standard for NaN and floating point numbers jest zdefiniowana.
Spróbuj Double.isNaN()
:
Zwraca prawdę, jeśli wartość jest dwukrotnie Not-a-Number (NaN), w przeciwnym wypadku false.
Pamiętaj, że [double.isNaN()
] nie będzie działać, ponieważ niepobrane duble nie mają powiązanych z nimi metod.
Myślałem, że nie można wywoływać metod na typach pierwotnych w Javie. To naprawdę musi być 'Double.isNan()', a nie 'double.IsNan()', prawda? – Joren
Joren, on polega na autoboxing (podwójne przekształcanie się w Double przez kompilator/środowisko wykonawcze); nowa funkcja od 1.5. Małe ryzyko pójścia w tym kierunku; przejście z Double do Double stwarza ryzyko NullPointerExceptions. – M1EK
Myślałem, że autoboxing działa tylko przy użyciu podwójnego jako argumentu, dodając go do kolekcji i tym podobne. Spróbuj zadeklarować podwójne x, a następnie pytanie x do isNaN() - daje mi błąd kompilatora. – Carl
Początkujący potrzebują praktycznych przykładów. więc wypróbuj poniższy kod.
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
Ten przykład robi za dużo i nie jest jasne, co próbujesz pokazać. To tylko kilka fragmentów kodu. –
Jako OP, który był początkującym, gdy pytanie to zadano w roku 2009, mogę zapewnić, że zaakceptowana odpowiedź była znacznie bardziej pomocna niż ten "praktyczny" przykład. –
Dziękuję @ p.g.gajendra babu za opublikowanie tego przykładowego kodu. – datnt
Możesz sprawdzić NaN za pomocą var != var
. NaN
nie jest równy NaN
.
EDIT: To chyba zdecydowanie najgorsza metoda. To jest mylące, okropne dla czytelności i ogólnie złej praktyki.
Czy ktoś może wyjaśnić sprawę? Wiem, że sposób jest bardzo zły, a 'isNan' jest lepszy dla czytelności, ale działa, prawda? A metoda 'isNan' używa tego do sprawdzenia' NaN'. – HyperNeutrino
Zgaduję, że spadł, ponieważ ta droga jest bardzo zła, a isNaN jest lepsza dla czytelności. –
Nie doceniłem cię, ale myślę, że przydatny byłby dodatkowy komentarz: jeśli porównasz opakowania takie jak Float lub Double, porównujesz odniesienia w ten sposób, a nie ich wartości, co zdecydowanie nie jest tym, czego potrzebujesz. –
Warto rozważyć także sprawdzenie, czy wartość jest skończona przez Double.isFinite(value)
. Od wersji Java 8 jest nowa metoda klasy Double
, w której można sprawdzić od razu, czy wartość nie ma wartości NaN i nieskończoności.
/**
* 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)
- 1. Jak sprawdzić NaN w golang
- 2. Jak sprawdzić, czy bieżące ustawienia narodowe są równe ciągowi znaków
- 3. Jak sprawdzić, czy wszystkie wiersze są równe w numpy?
- 4. Lua - Czy można sprawdzić, czy 2 funkcje są równe?
- 5. Jak sprawdzić, czy wszystkie wartości w tablicy są równe
- 6. jak sprawdzić, czy 2 pliki są równe przy użyciu .NET?
- 7. Jak mogę sprawdzić, czy wartości wielu komórek są równe?
- 8. Sprawdzanie, czy zmienna jest typu danych podwójne
- 9. Jak mogę sprawdzić, czy podwójne ma część ułamkową?
- 10. Sprawdzanie czy wartość float jest NaN
- 11. Jak sprawdzić, czy lista jest pusta?
- 12. Czy ustawienie PLIKU * jest równe przenośnemu stdout?
- 13. Jaka jest różnica między nan, NaN i NAN
- 14. Pandy - sprawdzić, czy wszystkie wartości są NaN szeregowo
- 15. Jak iterować wiersze ramki danych i sprawdzić, czy wartość w wierszu kolumny jest NaN
- 16. Bezpieczne jest równe makro?
- 17. Jak sprawdzić, czy jest konsola?
- 18. Głębokie odblaskowe porównanie jest równe
- 19. Jak przekonwertować NaN na 0?
- 20. Dlaczego nie możesz po prostu sprawdzić, czy errno jest równe ERANGE?
- 21. Jeśli dwie rzeczy nie są równe, czy są równe?
- 22. Sprawdź, czy dwie funkcje std :: są równe
- 23. Jak wykonać odniesienie jest równe w Groovy?
- 24. Jaka jest różnica między cichym NaN i sygnalizacyjnym NaN?
- 25. jaki jest najlepszy sposób ustalenia, czy podwójne nie jest zerowe?
- 26. Sprawdź, czy dwa typy ogólne są równe
- 27. Jak mogę sprawdzić, czy kolejka jest pusta?
- 28. Jak sprawdzić, czy alarm jest ustawiony?
- 29. Jak sprawdzić, czy DataGridViewCheckBoxCell jest sprawdzana
- 30. Jak sprawdzić, czy plik Global.asax jest wywoływany
Innym sposobem na to byłoby v! = V. Tylko NaN porównuje wartość false z samym sobą. Nie rób tego jednak, isNaN jest milion razy lepszy. :) – Joren
To nie działa dla mnie. Double.isNaN (var) działał jednak – fiacobelli
@Joren, lepiej późno niż wcale: 'isNaN' jest rzeczywiście lepszy w użyciu niż v! = V dla czytelności. Ale kod źródłowy metody isNaN jest dokładnie taki sam, jak w przypadku v. = V. Źródło: static public boolean isNaN (double v) { return (v! = V); } –