 <p>Here's a binary search algorithm I just wrote for you that does the trick:</p> <pre><code>import java.util.Random; public class RangeFinder { private void find(double query, double[] data) { if (data == null || data.length == 0) { throw new IllegalArgumentException("No data"); } System.out.print("query " + query + ", data " + data.length + " : "); Result result = new Result(); int max = data.length; int min = 0; while (result.lo == null &amp;&amp; result.hi == null) { int pos = (max - min) / 2 + min; if (pos == 0 &amp;&amp; query &lt; data[pos]) { result.hi = pos; } else if (pos == (data.length - 1) &amp;&amp; query &gt;= data[pos]) { result.lo = pos; } else if (data[pos] &lt;= query &amp;&amp; query &lt; data[pos + 1]) { result.lo = pos; result.hi = pos + 1; } else if (data[pos] &gt; query) { max = pos; } else { min = pos; } result.iterations++; } result.print(data); } private class Result { Integer lo; Integer hi; int iterations; long start = System.nanoTime(); void print(double[] data) { System.out.println( (lo == null ? "" : data[lo] + " &lt;= ") + "query" + (hi == null ? "" : " &lt; " + data[hi]) + " (" + iterations + " iterations in " + ((System.nanoTime() - start) / 1000000.0) + " ms. )"); } } public static void main(String[] args) { RangeFinder rangeFinder = new RangeFinder(); // test validation try { rangeFinder.find(12.4, new double[] {}); throw new RuntimeException("Validation failed"); } catch (IllegalArgumentException e) { System.out.println("Validation succeeded"); } try { rangeFinder.find(12.4, null); throw new RuntimeException("Validation failed"); } catch (IllegalArgumentException e) { System.out.println("Validation succeeded"); } // test edge cases with small data set double[] smallDataSet = new double[] { 2.0, 7.8, 9.0, 10.5, 12.3 }; rangeFinder.find(0, smallDataSet); rangeFinder.find(2.0, smallDataSet); rangeFinder.find(7.9, smallDataSet); rangeFinder.find(10.5, smallDataSet); rangeFinder.find(12.3, smallDataSet); rangeFinder.find(10000, smallDataSet); // test performance with large data set System.out.print("Preparing large data set..."); Random r = new Random(); double[] largeDataSet = new double[20000000]; largeDataSet[0] = r.nextDouble(); for (int n = 1; n &lt; largeDataSet.length; n++) { largeDataSet[n] = largeDataSet[n - 1] + r.nextDouble(); } System.out.println("done"); rangeFinder.find(0, largeDataSet); rangeFinder.find(5000000.42, largeDataSet); rangeFinder.find(20000000, largeDataSet); } } </code></pre>