Java双重比较与字符串比较

时间:2015-03-10 19:31:09

标签: java compare double

我遇到了一些旧的遗留代码,如下所示:

s1 = Double.toString(dbVal1);
s2 = Double.toString(dbVal2);
if (s1.compareTo(s2)!=0)
{
    return false;
}
return true;

其中dbVal1dbVal2都是双值。

我在分析时发现了这一点,并且toString方法调用占用了相当多的CPU时间。有什么理由我无法用1或2替换它吗?如果是的话,是否存在差异/哪一个更好?

1

return dbVal1 == dbVal2;

2

return Double.compare(dbVal1,dbVal2) == 0;

4 个答案:

答案 0 :(得分:1)

由于NaN,

dbVal1 == dbVal2String version不同。

double a = 0.0 / 0.0;
double b = 0.0 / 0.0;
System.out.println(a == b);    // false
System.out.println(Double.toString(a).equals(Double.toString(b)));    // true

我认为编写此代码的人希望NaN等于NaN。

答案 1 :(得分:1)

Double类提供了一种{Na}作为平等的compare方法。我已经测试了几个有趣的案例,并且在每种情况下它都给出了与更间接的String方法相同的结果:

public class Test {
  public static void main(String[] args) {
    testit(0.0,0.0);
    testit(0.0, -0.0);
    testit(Double.NaN, Double.NaN);
    testit(Double.NaN, 3.0);
    testit(Double.POSITIVE_INFINITY, Double.POSITIVE_INFINITY);
    testit(Double.NEGATIVE_INFINITY, Double.NEGATIVE_INFINITY);
  }

  private static void testit(double a, double b) {
    boolean doubleEquals = (a == b);
    boolean doubleCompare = Double.compare(a, b) == 0;
    boolean stringCompare = Double.toString(a).compareTo(Double.toString(b)) == 0;
    if(doubleCompare != stringCompare){
      System.out.print("* ");
    }
    System.out.println("a=" + a + " b=" + b + " double == " + doubleEquals
        + " Double compare " + doubleCompare + " String compare "
        + stringCompare);
  }
}

输出:

a=0.0 b=0.0 double == true Double compare true String compare true
a=0.0 b=-0.0 double == true Double compare false String compare false
a=NaN b=NaN double == false Double compare true String compare true
a=NaN b=3.0 double == false Double compare false String compare false
a=Infinity b=Infinity double == true Double compare true String compare true
a=-Infinity b=-Infinity double == true Double compare true String compare true

答案 2 :(得分:0)

当然,最快的方法是保留double个变量并进行比较。自动装箱,使用方法,if-else对CPU来说是不必要的负担。

答案 3 :(得分:0)

通常,double值的比较方式是它们的绝对差值在一定范围内。

这是因为double在内部表示的方式以及由于可能出现的舍入误差,取决于计算值的方式。

如果你绝对可以确保在你的情况下这些错误不是问题,那么直接比较它们也很有用。

在字符串域中进行比较对我来说似乎没用。

相关问题