Saltar al contenido

Comparando números en Java

Bienvenido a nuestra comunidad, en este sitio vas a encontrar la resolución a lo que estabas buscando.

Solución:

A Double es NUNCAequals a una Integer. Además, un double no es lo mismo que un Double.

Java tiene tipos primitivos y tipos de referencia. Los tipos verdaderamente numéricos en Java no se extienden desde Numberporque son primitivos.

Es posible que desee considerar un sistema en el que no mezcle tipos, porque eso generalmente causará muchos problemas con conversiones implícitas/explícitas que pueden/no perder información, etc.

Preguntas relacionadas

En int contra Integer:

  • ¿Cuál es la diferencia entre un int y un Integer en Java/C#?
  • ¿Está Java totalmente orientado a objetos?

En Number comparación:

  • ¿Por qué no java.lang.Number implementar Comparable?
  • Comparando los valores de dos Números genéricos

Ver también

  • Guía del lenguaje Java/Autoboxing
  • JLS 4.2 4.2 Tipos y valores primitivos

    los tipos numéricos son los tipos integrales y los tipos de coma flotante. Los tipos integrales son byte, short, inty long y char. Los tipos de punto flotante son float y double.


En mixed-tipo de cálculo

El cálculo de tipo mixto es el tema de al menos 4 acertijos en Rompecabezas de Java.

Aquí hay varios extractos:

generalmente es mejor evitar mixedCálculos de tipo […] porque son inherentemente confusos […] En ninguna parte es esto más evidente que en las expresiones condicionales. Las comparaciones de tipos mixtos siempre son confusas porque el sistema se ve obligado a promover un operando para que coincida con el tipo del otro. La conversión es invisible y es posible que no produzca los resultados esperados.

Prescripción: Evite cálculos que mezclen tipos integrales y de coma flotante. Prefiere la aritmética integral al punto flotante.

Sé que es un tema viejo, pero… Para comparar dos Números en Java puedes usar el método compareTo de BigDecimal. BigDecimal puede contener todo, desde short hasta double o BigInteger, por lo que es la clase perfecta para esto.

Así que puedes intentar escribir algo como esto:

public int compareTo(Number n1, Number n2) 
    // ignoring null handling
    BigDecimal b1 = new BigDecimal(n1.doubleValue());
    BigDecimal b2 = new BigDecimal(n2.doubleValue());
    return b1.compareTo(b2);

Seguramente este no es el mejor enfoque con respecto al rendimiento. Las siguientes pruebas funcionaron hasta ahora, al menos con JDK7:

assertTrue(compareTo(new Integer(1), new Integer(2)) == -1);
assertTrue(compareTo(new Integer(1), new Double(2.0)) == -1);
assertTrue(compareTo(new Integer(1), new Double(Double.MAX_VALUE)) == -1);
assertTrue(compareTo(new Integer(1), new Double(Double.MIN_VALUE)) == 1);
assertTrue(compareTo(new Integer(1), new Double(1.000001)) == -1);
assertTrue(compareTo(new Integer(1), new Double(1.000)) == 0);
assertTrue(compareTo(new Integer(1), new Double(0.25*4)) == 0);
assertTrue(compareTo(new Integer(1), new AtomicLong(1)) == 0);

El método específico que sugiere fallaría, porque está usando equals() heredado de Object. Es decir, comprobaría si el Numberobjetos eran los mismos, no si sus valores somos lo mismo.

Si ese fue solo un ejemplo ilustrativo, actualizaré mi respuesta.

La respuesta de polygene en realidad cubre bastante el terreno al que me dirigía. También te puede interesar esta pregunta: ¿Por qué java.lang.Number no implementa Comparable?

Valoraciones y reseñas

Si guardas alguna sospecha o capacidad de perfeccionar nuestro artículo puedes ejecutar un paráfrasis y con mucho placer lo estudiaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *