在Java语言中,所有数值类型都是从java.lang.Number扩展而来的。有一个像下面这样的方法是个好主意吗?
public boolean areEqual(Number first, Number second) {
if (first != null && second != null) {
return first.equals(second);
}
}
我关心的是双精度2.00000不等于整数2的情况。这些是由内置的equals来处理的吗?如果没有,有没有办法用java写一个简单的数字比较函数?(外部库,如apache commons也可以)
发布于 2013-02-27 20:12:15
我知道这是一个古老的话题,但是....要在Java语言中比较两个数字,可以使用BigDecimal中的compareTo方法。BigDecimal可以容纳从short到double或BigInteger的所有内容,因此它是一个完美的类。
所以你可以试着写这样的代码:
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上,以下测试是有效的:
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);
发布于 2010-07-10 00:17:04
如果您想知道对象引用是否相同,那么现有的方法就可以满足您的要求。表示2.0
的Double
和表示2
的Integer
绝对是不同的对象,在一般意义上肯定不能互换。
如果只想知道数值是否相同,可以使用Number.doubleValue()方法将这两个数字转换为双精度,然后将这些数字比较在一起(可能允许较小的容差,因为大多数数字表示不准确,例如1.99999999996583代表应该是2的值,这取决于中间计算步骤)。类似于以下内容:
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;
}
}
发布于 2010-07-10 01:03:46
关于几个回答,我建议不要写这样的东西:
boolean compare(Object o1, Object o2)
{
if (o1==null)
return o2==null;
if (o2==null)
return false;
return o1.equals(o2);
}
这样写会更简洁,我相信效率会稍微高一些:
boolean compare(Object o1, Object o2)
{
return o1==o2 || o1!=null && o2!=null && o1.equals(o2);
}
如果两者都为空,则o1==o2将返回true。如果它们不是,但它们是同一个对象,也没问题。
从技术上讲,对于大多数equals实现来说,o2!=null并不是必需的,但如果你真的像上面的例子那样在对象上这样做,你当然不会知道每个重写是如何编写的。
https://stackoverflow.com/questions/3214448
复制相似问题