diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/SensorCtsHelper.java b/tests/tests/hardware/src/android/hardware/cts/helpers/SensorCtsHelper.java
index a69dc54..9cb3710 100644
--- a/tests/tests/hardware/src/android/hardware/cts/helpers/SensorCtsHelper.java
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/SensorCtsHelper.java
@@ -40,6 +40,9 @@
     /**
      * Get percentiles using nearest rank algorithm.
      *
+     * @param percentiles List of percentiles interested. Its range is 0 to 1, instead of in %.
+     *        The value will be internally bounded.
+     *
      * @throws IllegalArgumentException if the collection or percentiles is null or empty
      */
     public static <TValue extends Comparable<? super TValue>> List<TValue> getPercentileValue(
@@ -55,7 +58,9 @@
         List<TValue> percentileValues = new ArrayList<TValue>();
         for (float p : percentiles) {
             // zero-based array index
-            int arrayIndex = (int) Math.round(arrayCopy.size() * p + .5) - 1;
+            int arrayIndex = (int) Math.round(arrayCopy.size() * p - .5f);
+            // bound the index to avoid out of range error
+            arrayIndex = Math.min(Math.max(arrayIndex, 0), arrayCopy.size() - 1);
             percentileValues.add(arrayCopy.get(arrayIndex));
         }
         return percentileValues;
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/JitterVerification.java b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/JitterVerification.java
index d9ee5b8..9d36f37 100644
--- a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/JitterVerification.java
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/JitterVerification.java
@@ -16,8 +16,6 @@
 
 package android.hardware.cts.helpers.sensorverification;
 
-import junit.framework.Assert;
-
 import android.content.Context;
 import android.content.pm.PackageManager;
 
@@ -34,6 +32,7 @@
 import java.util.ArrayList;
 import java.util.LinkedList;
 import java.util.List;
+import junit.framework.Assert;
 
 /**
  * A {@link ISensorVerification} which verifies that the sensor jitter is in an acceptable range.
diff --git a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/JitterVerificationTest.java b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/JitterVerificationTest.java
index 79c3b65..d8e1586 100644
--- a/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/JitterVerificationTest.java
+++ b/tests/tests/hardware/src/android/hardware/cts/helpers/sensorverification/JitterVerificationTest.java
@@ -66,7 +66,8 @@
         } catch (AssertionError e) {
             // Expected;
         }
-        verifyStats(stats, false, 50); // 500 us range divide by 1ms requested sample time x 100%
+        verifyStats(stats, false, 25); // 500 us range (250 us in single-sided sense)
+                                       // divide by 1ms requested sample time x 100%
     }
 
     public void testCalculateDelta() {
@@ -74,48 +75,48 @@
         JitterVerification verification = getVerification(1, timestamps);
         List<Long> deltaValues = verification.getDeltaValues();
         assertEquals(4, deltaValues.size());
-        assertEquals(1, deltaValues.get(0).doubleValue());
-        assertEquals(1, deltaValues.get(1).doubleValue());
-        assertEquals(1, deltaValues.get(2).doubleValue());
-        assertEquals(1, deltaValues.get(3).doubleValue());
+        assertEquals(1, deltaValues.get(0).longValue());
+        assertEquals(1, deltaValues.get(1).longValue());
+        assertEquals(1, deltaValues.get(2).longValue());
+        assertEquals(1, deltaValues.get(3).longValue());
 
         timestamps = new long[]{0, 0, 2, 4, 4};
         verification = getVerification(1, timestamps);
         deltaValues = verification.getDeltaValues();
         assertEquals(4, deltaValues.size());
-        assertEquals(0, deltaValues.get(0).doubleValue());
-        assertEquals(2, deltaValues.get(1).doubleValue());
-        assertEquals(2, deltaValues.get(2).doubleValue());
-        assertEquals(0, deltaValues.get(3).doubleValue());
+        assertEquals(0, deltaValues.get(0).longValue());
+        assertEquals(2, deltaValues.get(1).longValue());
+        assertEquals(2, deltaValues.get(2).longValue());
+        assertEquals(0, deltaValues.get(3).longValue());
 
         timestamps = new long[]{0, 1, 4, 9, 16};
         verification = getVerification(1, timestamps);
         deltaValues = verification.getDeltaValues();
         assertEquals(4, deltaValues.size());
-        assertEquals(1, deltaValues.get(0).doubleValue());
-        assertEquals(3, deltaValues.get(1).doubleValue());
-        assertEquals(5, deltaValues.get(2).doubleValue());
-        assertEquals(7, deltaValues.get(3).doubleValue());
+        assertEquals(1, deltaValues.get(0).longValue());
+        assertEquals(3, deltaValues.get(1).longValue());
+        assertEquals(5, deltaValues.get(2).longValue());
+        assertEquals(7, deltaValues.get(3).longValue());
     }
 
-    private static JitterVerification getVerification(int threshold, long ... timestamps) {
+    private static JitterVerification getVerification(int marginPercent, long ... timestamps) {
         Collection<TestSensorEvent> events = new ArrayList<>(timestamps.length);
         for (long timestamp : timestamps) {
             events.add(new TestSensorEvent(null, timestamp, 0, null));
         }
         long samplePeriodNs = 1000*1000; //1000Hz
-        long jitterThresholdNs = 20*1000; // 2%
+        long jitterThresholdNs = 20*1000; // 2% of that
 
         JitterVerification verification =
-                new JitterVerification(threshold, jitterThresholdNs, samplePeriodNs);
+                new JitterVerification(marginPercent/100.0f, jitterThresholdNs, samplePeriodNs);
         verification.addSensorEvents(events);
         return verification;
     }
 
-    private void verifyStats(SensorStats stats, boolean passed, double normalizedRange) {
+    private void verifyStats(SensorStats stats, boolean passed, double percentageJitter) {
         assertEquals(passed, stats.getValue(JitterVerification.PASSED_KEY));
         assertEquals(
-                normalizedRange,
+                percentageJitter,
                 (Double) stats.getValue(SensorStats.JITTER_95_PERCENTILE_PERCENT_KEY),
                 0.01);
     }
