contrario - ¿Cómo comparar dos números en Java?
lo contrario a equals en java (2)
Estrictamente hablando, el número no se puede comparar. Primero necesita definir la semántica de la comparación. Como mencionaste que es para uso de la biblioteca, probablemente solo quieras confiar en lo que ofrece la API Number.
Por lo tanto, se reduce a comparar los valores de longValue () o doubleValue (). Sugiero un enfoque que compare el uso de longValue () primero, y si resultan ser iguales , compare el doubleValue () también (de esta forma atraviesa desbordamientos largos, pero aún mantiene una precisión de 64 bit cuando los valores no son flotantes) :
public static int compare(Number n1, Number n2) {
long l1 = n1.longValue();
long l2 = n2.longValue();
if (l1 != l2)
return (l1 < l2 ? -1 : 1);
return Double.compare(n1.doubleValue(), n2.doubleValue());
}
Todo lo demás es un juego de adivinanzas que excede lo que ofrece el API Number. Para el uso estándar, el código debería funcionar bastante bien. Y sí, si lo pasa (por ejemplo) BigIntegers o BigDecimals que están fuera del rango de valores de Dobles o tienen diferencias solo superiores a 53 bits de precisión de mantisa, se detectan erróneamente como iguales , pero en lo que se refiere a la API de número. este resultado incorrecto se puede ver como el "correcto".
Posible duplicado:
Comparando los valores de dos números genéricos
Me gustaría comparar dos instancias arbitrarias de Number para descubrir cuál es mayor. Como usted sabe, esos pueden ser enteros, largos o dobles, pero también BigIntegers o BigDecimales. ¿Entonces lo que hay que hacer?
- El número no implementa Comparable .
- No se puede usar
doubleValue()
ya que puede haber una pérdida de precisión de BigDecimals o BigIntegers.
¿Realmente tengo que entrar en la prueba de instancia y el casting? Debe haber alguna biblioteca que haga esto. Pero ya he revisado Apache Commons y Guava sin suerte.
Editar 1: Comentarios señalados: Comparación de los valores de dos números genéricos . Tiene una solución que convierte todo en un BigDecimal usando toString()
. ¿Realmente no hay una mejor manera de hacer esto?
Editar 2: Acabo de publicar mi propia versión como respuesta a la otra pregunta . Debería ser más eficiente y robusto que la respuesta aceptada.
No puede comparar dos instancias arbitrarias de tipo Number
, porque esta es una operación posiblemente interminable. Imagine dos números irracionales, donde la única diferencia está en el milimétrico decimal. Tendría que comparar algunos miles de millones de decimales para esto.
Necesita convertir las instancias de Number
a BigDecimal
, aplicando el redondeo según sea necesario y luego compare estas dos.