比较双值

Shi*_*rty 2 java

我有两个双重值.我想检查两个double值是否相同.我有两种比较这个双值的方法.

第一种方式:

double a = 0.1;
double b = 0.2;
if(a == b) {
    System.out.println("Double values are same");
}
Run Code Online (Sandbox Code Playgroud)

另一种比较方式:

if(Double.compare(a, b) == 0) {
    System.out.println("Double values are same");
}
Run Code Online (Sandbox Code Playgroud)

哪一种最好的方法又准确?比较双值是否两种方式相同?

Tun*_*aki 8

Double.compare处理NaN和负零的情况不同于==.因为Double.compare,-0.0d不等于0.0d.

例如,以下代码:

public static void main(String... args) {
    double a = -0.0d;
    double b = 0.0d;
    if (a == b) {
        System.out.println("a == b");
    }
    if (Double.compare(a, b) == 0) {
        System.out.println("Double.compare(a, b) == 0");
    }
}
Run Code Online (Sandbox Code Playgroud)

只会打印a == b.

因此,这两个操作不相同.使用一个而不是另一个取决于您的要求.

关于==(和!=)的确切规则可以在JLS 第15.21.1节中找到:

根据IEEE 754标准的规则执行浮点相等性测试:

  • 如果任一操作数是NaN,则==的结果为false,但!=的结果为true.实际上,当且仅当x的值是NaN时,测试x!= x才为真.

  • 正零和负零被认为是相等的.

  • 否则,相等运算符认为两个不同的浮点值不相等.特别是,有一个值代表正无穷大,一个值代表负无穷大; 每个比较仅与自身相等,并且每个比较不等于所有其他值.

根据浮点数的这些注意事项,以下规则适用于整数操作数或NaN以外的浮点操作数:

  • 如果左侧操作数的值等于右侧操作数的值,则==运算符生成的值为true.否则,结果是错误的.
  • 如果左侧操作数的值不等于右侧操作数的值,则!=运算符生成的值为true.否则,结果是错误的.