Comment comparer deux nombres en Java? [dupliquer]

possible Duplicate:

comparaison des valeurs de deux numéros génériques

je voudrais comparer deux cas arbitraires de nombre pour trouver ce qui est plus grand. Comme vous le savez, ceux-ci peuvent être entiers, Longs ou Doubles, mais aussi BigIntegers ou BigDecimals. Alors, que faire?

  1. nombre n'est pas mettre en œuvre Comparable .
  2. ne peut pas utiliser doubleValue() car il pourrait y avoir une perte de précision de la part des gros bonnets ou des gros bonnets.

Dois-je vraiment aller dans l'instance de test et de casting? Il doit être une bibliothèque qui fait cela. Mais J'ai déjà vérifié Apache Commons et Guava sans succès.

Edit 1: Commentaires a souligné: en Comparant les valeurs des deux génériques Numéros de . Il a une solution qui convertit tout en un BigDecimal en utilisant toString() . Il n'y a vraiment pas de meilleure façon de le faire?

Edit 2: je viens de poster ma propre version comme réponse à l'autre question . Elle devrait être plus efficace et plus robuste que la réponse acceptée.

20
demandé sur Community 2012-09-24 12:39:37

2 réponses

vous ne pouvez pas comparer deux instances arbitraires de type Number , parce que c'est une opération probablement sans fin. Imaginez deux nombres irrationnels, où la seule différence est dans la décimale du milliard. Il faudrait comparer quelques milliards de décimales pour cela.

vous devez convertir vos instances Number en BigDecimal , en arrondissant si nécessaire, puis comparer les deux.

17
répondu SpaceTrucker 2012-09-25 14:56:27

à proprement parler, le nombre ne peut pas être comparé. Vous devez tout d'abord définir la sémantique de la comparaison. Puisque vous avez mentionné son pour l'usage de la bibliothèque, vous voulez probablement compter seulement sur ce que L'API de nombre offre.

est donc en baisse de comparer les valeurs de longValue() ou doubleValue(). Je suggère une approche qui compare l'utilisation de longValue() d'abord, et si elles s'avèrent être égale , comparez la doubleValue () aussi bien (de cette façon vous attraper de longs débordements, mais maintenir quand même une précision de 64 bits lorsque les valeurs ne sont pas des flotteurs):

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());
}

tout le reste est un jeu de devinettes dépassant ce que L'API de nombre offre. Pour l'utilisation standard ci-dessus code devrait fonctionner assez bien. Et oui, si vous le passez (par exemple) BigIntegers ou BigDecimals qui sont en dehors de la gamme de valeurs Doubles ou ont une différence seulement au-delà de 53 bits de précision mantissa, ils sont à tort détectés comme étant égale , mais en ce qui concerne L'API nombre est concerné ce résultat erroné peut être considéré comme le" correct".

7
répondu Durandal 2012-09-24 12:31:32