Java 双重比较与字符串比较

标签 java compare double

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

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

其中 dbVal1dbVal2 都是 double 值。

我在分析时发现了这一点,并且 toString 方法调用需要相当多的 CPU 时间。有什么原因我不能用 1 或 2 替换它吗?如果是这样,有什么区别/哪个更好?

1.

return dbVal1 == dbVal2;

2.

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

最佳答案

Double 类提供了一个将 NaN 视为相等的 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

关于Java 双重比较与字符串比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28972497/

相关文章:

java - 在混合租赁上下文中生成 EntityManager

java - 如何使用在主类中调用/设置的另一个类在类上设置值

java - 如何以编程方式添加 EditText?

python - 如何在python中比较IPV6地址

java - 在 Java 中有意义地比较两个字符串

java - 我的圆周率计算器有什么问题?

python - 逐行比较不同形状的 numpy 数组,删除相同的值?

python - 如何使用 python 比较两个不同的 csv 文件?

c# - 寻找一种在 C# 中使用 float 的更简单方法

python - 在 Python 中将字符串列表转换为整数(或 double )