2012-10-12 261 views
10

Citado de Effective Java - Segunda edición por Joshua Bloch¿De qué manera los operadores relacionales no obedecen el contrato compareTo con los valores de coma flotante?

Para los campos de coma flotante, utilice Double.compare o Float.compare en lugar de los operadores relacionales, que no obedecen el contrato general para compare a cuando se aplica a valores de coma flotante.

No detalla por qué este es el caso.

lo tanto, mi pregunta es:

¿De qué manera los operadores relacionales no obedecen el contrato general para compareTo cuando se utiliza con valores de punto flotante?

+2

Relacionados: http://stackoverflow.com/a/3668105/396458 – NullUserException

+0

Estas clases permiten valores NaN, (no un número). –

Respuesta

6

Desde el javadoc:

public int compareTo(Double anotherDouble) 

Compara dos objetos dobles numéricamente. Hay dos formas en que las comparaciones realizadas por este método difieren de las realizadas por los operadores de comparación numérica de lenguaje Java (<, < =, ==,> =,>) cuando se aplica a valores dobles primitivos: Double.NaN es considerado por este método es igual a él y mayor que todos los demás valores dobles (incluido Double.POSITIVE_INFINITY). 0.0d se considera que este método es mayor que -0.0d. Esto asegura que el ordenamiento natural de objetos dobles impuesto por este método es consistente con iguales.

+0

Gracias por la buena referencia :) –

3

de Doc java Double#compareTo

Compara dos objetos dobles numéricamente. Hay dos formas en las que las comparaciones realizadas por este método difieren de las realizadas por los operadores de comparación numérica lenguaje Java (<, < =, ==,> =>) cuando se aplica a los valores primitivos dobles:

  • Double.NaN es considerado por este método como igual a él y mayor que todos los demás valores dobles (incluido Double.POSITIVE_INFINITY).

  • 0.0d se considera que este método es mayor que -0.0d.

Esto asegura que Double.compareTo (Objeto) (que remite su comportamiento a este método) obedece el contrato general para Comparable.compareTo, y que el orden natural de los dobles es consistente con los iguales.

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

Pero, en particular, es _no_ consistente con los operadores relacionales. –

+0

@LouisWasserman Sí. Añadido eso también. –

Cuestiones relacionadas