2012-10-12 10 views
10

Zitat von Effective Java - Second Edition von Joshua BlochIn welcher Weise gehorchen relationale Operatoren nicht dem compareTo-Vertrag mit Fließkommawerten?

Für Floating-Point-Felder verwenden Double.compare oder Float.compare anstelle der relationalen Operatoren, die den allgemeinen Vertrag nicht zu gehorchen compareTo bei Anwendung auf Gleitkommawerte.

Es wird nicht näher ausgeführt, warum dies der Fall ist.

Also, meine Frage ist:

In welcher Weise tun relationalen Operatoren nicht den allgemeinen Vertrag für compareTo, wenn sie mit Gleitkommazahlen verwendet gehorchen?

+2

In Verbindung stehend: http://Stackoverflow.com/a/3668105/396458 – NullUserException

+0

Diese Klassen erlauben NaN, (Not A Number) -Werte. –

Antwort

6

Vom javadoc:

public int compareTo(Double anotherDouble) 

Vergleicht zwei Doppel Objekte numerisch. Es gibt zwei Arten, in denen durch diese Methode durchgeführte Vergleiche von denen abweichen, die von den numerischen Vergleichsoperatoren in Java durchgeführt werden (<, < =, ==,> =,>), wenn sie auf primitive doppelte Werte angewendet werden: Double.NaN wird betrachtet von Diese Methode ist für sich gleich und größer als alle anderen doppelten Werte (einschließlich Double.POSITIVE_INFINITY). 0,0d wird bei dieser Methode als größer als -0,0d angesehen. Dies stellt sicher, dass die natürliche Reihenfolge von Double-Objekten, die durch diese Methode auferlegt werden, mit equals konsistent ist.

+0

Danke für die gute Referenz :) –

3

Von java doc Double#compareTo

Vergleicht zwei Doppel Objekte numerisch. Es gibt zwei Möglichkeiten, in denen nach dieser Methode durchgeführt Vergleiche von denen unterscheiden, die durch die Sprache Java ausgeführt numerischen Vergleichsoperatoren (<, < =, ==,> =>), wenn auf primitive Doppel Werte:

  • Double.NaN wird von dieser Methode als gleich und größer als alle anderen doppelten Werte (einschließlich Double.POSITIVE_INFINITY) betrachtet.

  • 0.0d wird bei dieser Methode als größer als -0.0d angesehen.

Dies stellt sicher, dass Double.compareTo (Object) (die das Verhalten diese Methode weiterleitet) für Comparable.compareTo den allgemeinen Vertrag gehorcht, und dass die natürliche Ordnung auf Doubles steht im Einklang mit Gleichgestellten.

double d1 =Double.NaN; 
    double d2 = Double.NaN; 

    System.out.println(Double.valueOf(d1).equals(d2)); ---> true 
    System.out.println(Double.valueOf(d1).compareTo(d2)); ---> 0 
    System.out.println(d1 == d2);       --->false 
+0

Aber insbesondere ist es nicht mit den relationalen Operatoren konsistent. –

+0

@LouisWasserman Ja. Hinzugefügt das auch. –