首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Java中比较数字

在Java中比较数字
EN

Stack Overflow用户
提问于 2010-07-10 00:05:15
回答 6查看 98.3K关注 0票数 25

在Java语言中,所有数值类型都是从java.lang.Number扩展而来的。有一个像下面这样的方法是个好主意吗?

代码语言:javascript
复制
public boolean areEqual(Number first, Number second) {
    if (first != null && second != null) {
        return first.equals(second);
    }
}

我关心的是双精度2.00000不等于整数2的情况。这些是由内置的equals来处理的吗?如果没有,有没有办法用java写一个简单的数字比较函数?(外部库,如apache commons也可以)

EN

回答 6

Stack Overflow用户

发布于 2013-02-27 20:12:15

我知道这是一个古老的话题,但是....要在Java语言中比较两个数字,可以使用BigDecimal中的compareTo方法。BigDecimal可以容纳从short到double或BigInteger的所有内容,因此它是一个完美的类。

所以你可以试着写这样的代码:

代码语言:javascript
复制
public int compareTo(Number n1, Number n2) {
    // ignoring null handling
    BigDecimal b1 = new BigDecimal(n1.doubleValue());
    BigDecimal b2 = new BigDecimal(n2.doubleValue());
    return b1.compareTo(b2);
}

就性能而言,这肯定不是最好的方法。到目前为止,至少在JDK7上,以下测试是有效的:

代码语言:javascript
复制
assertTrue(compareTo(new Integer(1), new Integer(2)) == -1);
assertTrue(compareTo(new Integer(1), new Double(2.0)) == -1);
assertTrue(compareTo(new Integer(1), new Double(Double.MAX_VALUE)) == -1);
assertTrue(compareTo(new Integer(1), new Double(Double.MIN_VALUE)) == 1);
assertTrue(compareTo(new Integer(1), new Double(1.000001)) == -1);
assertTrue(compareTo(new Integer(1), new Double(1.000)) == 0);
assertTrue(compareTo(new Integer(1), new Double(0.25*4)) == 0);
assertTrue(compareTo(new Integer(1), new AtomicLong(1)) == 0);
票数 15
EN

Stack Overflow用户

发布于 2010-07-10 00:17:04

如果您想知道对象引用是否相同,那么现有的方法就可以满足您的要求。表示2.0Double和表示2Integer绝对是不同的对象,在一般意义上肯定不能互换。

如果只想知道数值是否相同,可以使用Number.doubleValue()方法将这两个数字转换为双精度,然后将这些数字比较在一起(可能允许较小的容差,因为大多数数字表示不准确,例如1.99999999996583代表应该是2的值,这取决于中间计算步骤)。类似于以下内容:

代码语言:javascript
复制
private static final double EPSILON = 0.000000000000001d;    

public static boolean areEquivalentNumbers(Number a, Number b)
{
   if (a == null)
   {
      return b == null;
   }
   else if (b == null)
   {
      return false;
   }
   else
   {
      return Math.abs(a.doubleValue() - b.doubleValue()) < EPSILON;
   }
}
票数 4
EN

Stack Overflow用户

发布于 2010-07-10 01:03:46

关于几个回答,我建议不要写这样的东西:

代码语言:javascript
复制
boolean compare(Object o1, Object o2)
{
  if (o1==null)
    return o2==null;
  if (o2==null)
    return false;
  return o1.equals(o2);
}

这样写会更简洁,我相信效率会稍微高一些:

代码语言:javascript
复制
boolean compare(Object o1, Object o2)
{
  return o1==o2 || o1!=null && o2!=null && o1.equals(o2);
}

如果两者都为空,则o1==o2将返回true。如果它们不是,但它们是同一个对象,也没问题。

从技术上讲,对于大多数equals实现来说,o2!=null并不是必需的,但如果你真的像上面的例子那样在对象上这样做,你当然不会知道每个重写是如何编写的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3214448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档