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

如何在Java中比较两个数字?,java,numbers,compare,Java,Numbers,Compare,可能重复: 我想比较两个任意的例子,找出哪个更大。正如你们所知,这些可能是整数、长整数或双整数,但也可能是大整数或大小数。那怎么办呢 数字不能实现 无法使用doubleValue(),因为可能会因为大小数或大整数而丢失精度 我真的需要进行实例测试和铸造吗?一定有这样的图书馆。但我已经查过了Apache Commons和番石榴,运气不好 编辑1:评论指出:。它有一个解决方案,可以使用toString()将所有内容转换为BigDecimal。真的没有更好的办法吗 编辑2:我刚刚发布。它应该比公认的

可能重复:

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

  • 数字不能实现
  • 无法使用
    doubleValue()
    ,因为可能会因为大小数或大整数而丢失精度
  • 我真的需要进行实例测试和铸造吗?一定有这样的图书馆。但我已经查过了Apache Commons和番石榴,运气不好

    编辑1:评论指出:。它有一个解决方案,可以使用
    toString()
    将所有内容转换为BigDecimal。真的没有更好的办法吗


    编辑2:我刚刚发布。它应该比公认的答案更有效、更健壮。

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


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

    严格来说,数字是无法比较的。首先需要定义比较的语义。既然您提到它是用于库的,那么您可能只想依赖API提供的数字

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

    公共静态整数比较(数字n1,数字n2){
    long l1=n1.longValue();
    long l2=n2.longValue();
    如果(l1!=l2)
    返回(l1

    其他一切都是一个猜测游戏,超出了API提供的数量。对于标准使用,上述代码应该工作得相当好。是的,如果你传递的是(例如)超出双精度值范围的大整数或大小数,或者它们的差值仅超过尾数精度的53位,它们被错误地检测为相等,但就数字API而言,这个错误的结果可以被视为“正确”一。

    将任何内容转换为
    大十进制数
    ?请参阅此答案和其中的链接:为什么要比较任意数类?为什么它们不都是相同的类型?好问题,一定要看看@MicSimI agree和SJuan76提供的链接。我也用了一种方法,将任何数字转换成一个大的十进制数,然后进行比较。有趣的评论,谢谢。但是,由于这是针对库的,所以我不能决定何时何地进行舍入。然后,您应该让库的用户能够定义使用何种舍入以及所需的精度。我认为应该首先比较
    双值
    ;否则,我认为NaN将在-1和下一个较大的值之间排序。
    
    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());
    }