2012-10-12 11 views
10

Cytat z Effective Java - Second Edition przez Joshua BlochW jaki sposób operatory relacyjne nie są zgodne z umową compareTo z wartościami zmiennoprzecinkowymi?

Dla pól zmiennoprzecinkowych, użyj Double.compare lub Float.compare zamiast relacyjnych operatorów, które nie przestrzegają umowy generalnej dla compareTo po zastosowaniu do wartości zmiennoprzecinkowych.

Nie wyjaśnia, dlaczego tak się dzieje.

Więc moje pytanie brzmi:

W jaki sposób zrobić operatory relacyjne nie słuchać ogólną umowę CompareTo kiedy stosować zmiennoprzecinkowych?

+2

Powiązane: http://stackoverflow.com/a/3668105/396458 – NullUserException

+0

Te klauzule pozwalają na wartości NaN, (Nie A Number). –

Odpowiedz

6

Z javadoc:

public int compareTo(Double anotherDouble) 

Porównuje dwa podwójne obiektów numerycznie. Istnieją dwa sposoby, w jakie porównania wykonywane za pomocą tej metody różnią się od porównań wykonanych przez operatory porównania liczbowego języka Java (<, < =, ==,> =,>) po zastosowaniu do pierwotnych podwójnych wartości: Double.NaN jest rozpatrywane przez ta metoda jest równa sobie i większa niż wszystkie inne podwójne wartości (w tym Double.POSITIVE_INFINITY). W tej metodzie wartość 0.0d jest większa niż -0,0d. Zapewnia to, że naturalna kolejność obiektów podwójnych nałożonych tą metodą jest równa wartościom równym.

+0

Dzięki za dobre referencje :) –

3

Od java doc Double#compareTo

Porównuje dwa podwójne obiektów numerycznie. Istnieją dwa sposoby, w których porównania wykonywane za pomocą tej metody różnią się od tych wykonywanych przez język Java numerycznych operatorów porównania (<, < =, ==,> =>), gdy stosuje się do pierwotnych wartości dwuosobowych:

  • Double.NaN jest przez tę metodę uznawane za równe sobie i większe niż wszystkie inne podwójne wartości (w tym Double.POSITIVE_INFINITY).

  • W tej metodzie wartość 0,0d jest większa niż -0,0d.

Gwarantuje to Double.compareTo (Object) (który przekazuje swoje zachowanie do tej metody) przestrzega ogólnych umowy Comparable.compareTo i że naturalny porządek na Doubles jest zgodny z równymi.

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

Ale, w szczególności, jest _nie_ zgodna z operatorami relacyjnymi. –

+0

@LouisWasserman Tak. Dodałem to też. –

Powiązane problemy