如何在Java中比较两个数字



可能的重复:
比较两个泛型数字的值

我想比较Number的两个任意实例,找出哪个更大。正如你所知,这些可能是整数、长或双,也可能是大整数或大小数。那该怎么办呢?

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

我真的必须进行实例测试和铸造吗?必须有这样的库。但我已经检查了Apache Commons和Guava,但运气不好。

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

编辑2:我刚刚发布了自己的版本,作为对另一个问题的回答。它应该比公认的答案更有效、更稳健。

不能比较Number类型的两个任意实例,因为这可能是一个无休止的操作。想象两个无理数,其中唯一的区别是小数点后第十亿位。你必须比较几十亿个小数。

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

严格来说,数字是无法比较的。您首先需要定义比较的语义。既然您提到它是用于库的,那么您可能只想依赖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());
}

其他一切都是一场超越数字API的猜谜游戏。对于标准使用,上述代码应该工作得相当好。是的,如果您传递(例如)超出Doubles值范围或差异仅超过53位尾数精度的BigIntegers或BigDecimal,它们会被错误地检测为等于,但就Number API而言,这个错误结果可以被视为"正确"结果。

相关内容

  • 没有找到相关文章

最新更新