diff --git a/user/super/com/google/gwt/emul/java/util/Arrays.java b/user/super/com/google/gwt/emul/java/util/Arrays.java
index 06c1ded..7af525f 100644
--- a/user/super/com/google/gwt/emul/java/util/Arrays.java
+++ b/user/super/com/google/gwt/emul/java/util/Arrays.java
@@ -254,9 +254,10 @@
       final int mid = low + ((high - low) >> 1);
       final double midVal = sortedArray[mid];
 
-      if (midVal < key) {
+      int cmp = Double.compare(midVal, key);
+      if (cmp < 0) {
         low = mid + 1;
-      } else if (midVal > key) {
+      } else if (cmp > 0) {
         high = mid - 1;
       } else {
         // key found
diff --git a/user/test/com/google/gwt/emultest/java/util/ArraysDoubleSemanticsTest.java b/user/test/com/google/gwt/emultest/java/util/ArraysDoubleSemanticsTest.java
index e1429c9..42d9b2f 100644
--- a/user/test/com/google/gwt/emultest/java/util/ArraysDoubleSemanticsTest.java
+++ b/user/test/com/google/gwt/emultest/java/util/ArraysDoubleSemanticsTest.java
@@ -37,18 +37,4 @@
     // Should be assertTrue(Arrays.equals(new double[] {Double.NaN}, new double[] {Double.NaN}));
     assertFalse(Arrays.equals(new double[] {Double.NaN}, new double[] {Double.NaN}));
   }
-
-  public void testBinarySearch() throws Exception {
-    // Semantics don't match JVM.
-    if (TestUtils.isJvm()) {
-      return;
-    }
-
-    // Should be assertEquals(-1, Arrays.binarySearch(new double[] {-0.0d}, 0.0d));
-    assertEquals(0, Arrays.binarySearch(new double[] {-0.0d}, 0.0d));
-    // Should be assertEquals(-1, Arrays.binarySearch(new double[] {0.0d}, Double.NaN));
-    assertEquals(0, Arrays.binarySearch(new double[] {0.0d}, Double.NaN));
-    // Should be assertEquals(1, Arrays.binarySearch(new double[] {0.0d, Double.NaN}, Double.NaN));
-    assertEquals(0, Arrays.binarySearch(new double[] {0.0d, Double.NaN}, Double.NaN));
-  }
 }
diff --git a/user/test/com/google/gwt/emultest/java/util/ArraysFloatSemanticsTest.java b/user/test/com/google/gwt/emultest/java/util/ArraysFloatSemanticsTest.java
index 31de695..2c38e2a 100644
--- a/user/test/com/google/gwt/emultest/java/util/ArraysFloatSemanticsTest.java
+++ b/user/test/com/google/gwt/emultest/java/util/ArraysFloatSemanticsTest.java
@@ -37,18 +37,4 @@
     // Should be assertTrue(Arrays.equals(new float[] {Float.NaN}, new float[] {Float.NaN}));
     assertFalse(Arrays.equals(new float[] {Float.NaN}, new float[] {Float.NaN}));
   }
-
-  public void testBinarySearch() throws Exception {
-    // Semantics don't match JVM.
-    if (TestUtils.isJvm()) {
-      return;
-    }
-
-    // Should be assertEquals(-1, Arrays.binarySearch(new float[] {-0.0f}, 0.0f));
-    assertEquals(0, Arrays.binarySearch(new float[] {-0.0f}, 0.0f));
-    // Should be assertEquals(-1, Arrays.binarySearch(new float[] {0.0f}, Float.NaN));
-    assertEquals(0, Arrays.binarySearch(new float[] {0.0f}, Float.NaN));
-    // Should be assertEquals(1, Arrays.binarySearch(new float[] {0.0f, Float.NaN}, Float.NaN));
-    assertEquals(0, Arrays.binarySearch(new float[] {0.0f, Float.NaN}, Float.NaN));
-  }
 }
diff --git a/user/test/com/google/gwt/emultest/java/util/ArraysTest.java b/user/test/com/google/gwt/emultest/java/util/ArraysTest.java
index 47d4e47..bed413c 100644
--- a/user/test/com/google/gwt/emultest/java/util/ArraysTest.java
+++ b/user/test/com/google/gwt/emultest/java/util/ArraysTest.java
@@ -299,6 +299,10 @@
     assertEquals(2, ret);
     ret = Arrays.binarySearch(a3, 1, 4, -71);
     assertEquals(-2, ret);
+
+    assertEquals(-2, Arrays.binarySearch(new float[] {-0.0f}, 0.0f));
+    assertEquals(-2, Arrays.binarySearch(new float[] {0.0f}, Float.NaN));
+    assertEquals(1, Arrays.binarySearch(new float[] {0.0f, Float.NaN}, Float.NaN));
   }
 
   /**
@@ -336,6 +340,10 @@
     assertEquals(2, ret);
     ret = Arrays.binarySearch(a3, 1, 4, -71);
     assertEquals(-2, ret);
+
+    assertEquals(-2, Arrays.binarySearch(new float[] {-0.0f}, 0.0f));
+    assertEquals(-2, Arrays.binarySearch(new float[] {0.0f}, Float.NaN));
+    assertEquals(1, Arrays.binarySearch(new float[] {0.0f, Float.NaN}, Float.NaN));
   }
 
   /**
