JAVA:二进制搜索适用于整数数组,但不适用于双精度数组

问题描述 投票:0回答:1

我正在研究Daniel Liang撰写的Java入门手册第10版中的示例之一。

我在第7章中对一维数组执行二进制搜索时遇到问题。当我在整数数组上使用我的代码时,它可以正常工作,但是当我输入一个double时,它不能工作。

这是我用于整数数组的代码:

//二进制搜索

        int low = 0;
        int high = a.length-1;
        while(high>=low){
            int mid = (int) ((low+high)/2);
            if (key < a[mid])
                high = mid - 1;
            else if (key == a[mid])
                return mid;
            else
                low= mid + 1;
        }
        return -low -1;
    }

上面的代码对整数数组没有任何干扰,但是当我将其修改为double时,它会返回一个值,该值指示未找到键-即使当我输入数组中的键时也是如此。

这是我用于双精度数组的代码

//二进制搜索

public static int binarySearch(double [] a, int key){
      int low = 0;
      int high = a.length-1;
      while(high>=low){
          int mid = (int) ((low+high)/2);
          if (key < a[mid])
              high = mid - 1;
          else if (key == a[mid])
              return mid;
          else
              low= mid + 1;
      }
      return -low -1;
  }

请告知我是否需要对代码进行其他更改才能使其与double一起使用。到目前为止,这本书还没有给我提供双重示例。

谢谢!

java binary-search
1个回答
0
投票

加倍是确切数字吗?

比较双精度数和整数时,十进制值的变化会使比较语句为假。

比较时,一种解决方法可以将double转换为int。

public class Main {
    public static void main(String[] args) throws Exception {
        double d1 = 100.000000001;
        double d2 = 100.000000000;
        int i = 100;

        System.out.println(d1 == i);
        System.out.println(d2 == i);
        int int1 = (int)d1;
        int int2 = (int)d2;

        System.out.println(int1 == i);
        System.out.println(int2 == i);
    }
}

输出:

false
true
true
true
© www.soinside.com 2019 - 2024. All rights reserved.