Binary Search Implementation for Integer Array
Integer division does the right rounding. There is no need to bring in a double machinery.
Search and related algorithms are cleaner on the semi-open intervals (that is, the right boundary is one past the last element).
Testing first and last element looks like a premature optimization. In overwhelming number of cases it is just a waste of time.
Java does not detect and/or eliminate tail recursion. The algorithm can and should be made iterative.


Edit: tail recursion elimination.

Once you found that the recursion is really a tail one, the rest is fairly mechanical.


Rewrite the code to explicit tail form:

if (left &gt;= right) {
    doWhateverNotFoundActionYouWant();
}

middle = left + (right - left)/2;
midValue = value[middle];

if (target &lt; midValue) {
    right = middle;
} else if (target &gt; midValue) {
    left = middle + 1;
} else {
    return middle;
}
return recurse(value, left, right);

Remove the recursion, and replace if with while (don't forget to invert the condition):

while (left &lt; right) {
    middle = left + (right - left)/2;
    midValue = value[middle];

    if (target &lt; midValue) {
        right = middle;
    else if (target &gt; midValue) {
        left = middle + 1;
    } else {
        return middle;
    }
}