2016-07-25 21 views
2

Ich weiß, dass wegen der binären doppelten Darstellung, ist der Vergleich für die Gleichheit von zwei double s nicht ganz sicher. Aber ich brauche etwas Berechnung wie folgt auszuführen:Vergleichen von Doppel für Gleichheit ist nicht sicher. Also was tun, wenn man es mit 0 vergleichen möchte?

double a; 
//initializing 
if(a != 0){  // <----------- HERE 
    double b = 2/a; 
    //do other computation 
} 
throw new RuntimeException(); 

So, Vergleich von double s ist nicht sicher, aber ich möchte auf jeden Fall nicht von 0 bis devide Was in diesem Fall zu tun?

Ich würde BigDecimal verwenden, aber seine Leistung ist nicht ganz akzeptabel.

+0

verwandten: http://stackoverflow.com/questions/12114498/can-a-near-zero-floating-value-cause-a-divide-by-zero-error/12115243#12115243 –

+0

Dividing durch Null ist oft eine überraschend vernünftige Sache mit Doubles zu tun. – user2357112

+0

versuchen, die Division durch Null Ausnahme –

Antwort

5

Nun, wenn Ihr Problem durch Null teilt, ist die gute Nachricht, dass Sie tun können, was Sie haben, wenn der Wert nicht wirklich 0 ist, können Sie dadurch teilen, auch wenn es wirklich, wirklich klein ist.

Sie können einen Bereichsvergleich verwenden und ihn mit dem niedrigsten Wert vergleichen, den Sie zulassen möchten, z. a >= 0.0000000000001 oder ähnlich (wenn es immer positiv wird).

+0

Tatsächlich, in diesem speziellen Fall verursachen sehr, sehr kleine Werte keine DevisionByZero-bezogene 'Exception', und es ist sicher. Vielen Dank. – user3663882

+0

Nicht einmal durch Null zu teilen verursacht eine Ausnahme in der Doppelarithmetik; es gibt nur ein (gültiges) unendliches Ergebnis zurück. –

+0

@LouisWasserman: Ich dachte das auch, danke für die Bestätigung. Ich war nicht sicher genug über meine Fakten (mein Java ist rostig), um es in einer Antwort zu sagen, die ich unbeaufsichtigt lassen würde, auch nach dem Lesen [* Division eines von Null verschiedenen endlichen Wertes durch eine Null führt zu einer vorzeichenbehafteten Unendlichkeit. Das Zeichen richtet sich nach der oben genannten Regel. *] (Https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.17.2). –

0

Was ist mit der Verwendung der statischen Methode vergleichen der Double-Class-Wrapper?

double a = 0.0; 
// initializing 
if (Double.compare(a, 0.0) != 0) { 

} 
+0

hm ... aber ist es tatsächlich anders als im ursprünglichen Beispiel? – user3663882

+3

Dies bietet keinen Vorteil gegenüber einem regulären '== 0'-Vergleich. – user2357112

+1

ja ... Sie delegieren die Vergleichsoperation an die Klasse Double ... so wie es erledigt ist, ist keiner Ihrer Bussines mehr ... –