如何在Java中比较两个数字?

可能重复:
比较两个通用数字的值

我想比较两个任意的Number实例来找出哪个更大。 如您所知,这些可能是整数,长整数或双数,但也可能是BigIntegers或BigDecimals。 那么该怎么办?

  1. Number没有实现Comparable 。
  2. 不能使用doubleValue()因为BigDecimals或BigIntegers可能会丢失精度。

我是否真的必须进行实例测试和投射? 必须有一些库可以做到这一点。 但我已经检查过Apache Commons和Guava没有运气。

编辑1:评论指出了这一点: 比较两个通用数字的值 。 它有一个解决方案,使用toString()将所有内容转换为BigDecimal。 真的没有更好的办法吗?

编辑2:我刚刚发布了自己的版本作为另一个问题的答案 。 它应该比公认的答案更有效和更强大。

您无法比较Number类型的两个任意实例,因为这可能是无穷无尽的操作。 想象一下两个无理数,其中唯一的区别在于十亿分之一。 你必须比较几十亿个小数。

您需要将Number实例转换为BigDecimal ,根据需要应用舍入,然后比较这两者。

严格来说,Number无法比较。 首先需要定义比较的语义。 由于您提到它用于库,您可能只想依赖Number API提供的内容。

因此,它要比较longValue()或doubleValue()的值。 我建议首先使用longValue()进行比较,如果它们相等 ,则比较doubleValue()(这样可以捕获长溢出,但是当值不是浮点数时仍保持64位长的精度) :

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

其他一切都是超过Number API提供的猜谜游戏。 对于标准用途,上面代码应该运行得相当好。 是的,如果你传递它(例如)超出双倍值范围的BigIntegers或BigDecimals或者只有超过53位尾数精度的差异,它们被错误地检测为相等 ,但就数字API而言这个错误的结果可以被视为“正确”的结果。