diff --git a/core-java-modules/core-java-lang-math-4/README.md b/core-java-modules/core-java-lang-math-4/README.md
new file mode 100644
index 0000000000..0c28f94821
--- /dev/null
+++ b/core-java-modules/core-java-lang-math-4/README.md
@@ -0,0 +1,3 @@
+=========
+
+### Relevant articles:
diff --git a/core-java-modules/core-java-lang-math-4/pom.xml b/core-java-modules/core-java-lang-math-4/pom.xml
new file mode 100644
index 0000000000..e818855d36
--- /dev/null
+++ b/core-java-modules/core-java-lang-math-4/pom.xml
@@ -0,0 +1,15 @@
+
+
+ 4.0.0
+ core-java-lang-math-4
+ core-java-lang-math-4
+
+
+ com.baeldung.core-java-modules
+ core-java-modules
+ 0.0.1-SNAPSHOT
+
+
+
diff --git a/core-java-modules/core-java-lang-math-4/src/test/java/com/baeldung/percentile/CalculatePercentileUnitTest.java b/core-java-modules/core-java-lang-math-4/src/test/java/com/baeldung/percentile/CalculatePercentileUnitTest.java
new file mode 100644
index 0000000000..7b46b37e38
--- /dev/null
+++ b/core-java-modules/core-java-lang-math-4/src/test/java/com/baeldung/percentile/CalculatePercentileUnitTest.java
@@ -0,0 +1,78 @@
+package com.baeldung.percentile;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+import org.junit.jupiter.api.Test;
+
+public class CalculatePercentileUnitTest {
+
+ public static > T getPercentile(Collection input, double percentile) {
+ if (input == null || input.isEmpty()) {
+ throw new IllegalArgumentException("The input dataset cannot be null or empty.");
+ }
+ if (percentile < 0 || percentile > 100) {
+ throw new IllegalArgumentException("Percentile must be between 0 and 100(exclusive)");
+ }
+ List sortedList = input.stream()
+ .sorted()
+ .collect(Collectors.toList());
+
+ int rank = percentile == 0 ? 1 : (int) Math.ceil(percentile / 100.0 * input.size());
+ return sortedList.get(rank - 1);
+ }
+
+ @Test
+ void whenCallingGetPercentileWithAList_thenGetExpectedResult() {
+ assertThrows(IllegalArgumentException.class, () -> getPercentile(List.of(1, 2, 3), -1));
+ assertThrows(IllegalArgumentException.class, () -> getPercentile(List.of(1, 2, 3), 101));
+
+ List list100 = IntStream.rangeClosed(1, 100)
+ .boxed()
+ .collect(Collectors.toList());
+ Collections.shuffle(list100);
+
+ assertEquals(1, getPercentile(list100, 0));
+ assertEquals(10, getPercentile(list100, 10));
+ assertEquals(25, getPercentile(list100, 25));
+ assertEquals(50, getPercentile(list100, 50));
+ assertEquals(76, getPercentile(list100, 75.3));
+ assertEquals(100, getPercentile(list100, 100));
+
+ List list8 = IntStream.of(-1, 200, 30, 42, -5, 7, 8, 92)
+ .boxed()
+ .collect(Collectors.toList());
+
+ assertEquals(-5, getPercentile(list8, 0));
+ assertEquals(-5, getPercentile(list8, 10));
+ assertEquals(-1, getPercentile(list8, 25));
+ assertEquals(8, getPercentile(list8, 50));
+ assertEquals(92, getPercentile(list8, 75.3));
+ assertEquals(200, getPercentile(list8, 100));
+ }
+
+ @Test
+ void whenCallingGetPercentileWithAnArray_thenGetExpectedResult() {
+
+ long[] theArray = new long[] { -1, 200, 30, 42, -5, 7, 8, 92 };
+
+ //convert the long[] array to a List
+ List list8 = Arrays.stream(theArray)
+ .boxed()
+ .toList();
+
+ assertEquals(-5, getPercentile(list8, 0));
+ assertEquals(-5, getPercentile(list8, 10));
+ assertEquals(-1, getPercentile(list8, 25));
+ assertEquals(8, getPercentile(list8, 50));
+ assertEquals(92, getPercentile(list8, 75.3));
+ assertEquals(200, getPercentile(list8, 100));
+ }
+}
\ No newline at end of file
diff --git a/core-java-modules/pom.xml b/core-java-modules/pom.xml
index 36b589ca75..85df51457c 100644
--- a/core-java-modules/pom.xml
+++ b/core-java-modules/pom.xml
@@ -144,6 +144,7 @@
core-java-lang-6
core-java-lang-math
core-java-lang-math-2
+ core-java-lang-math-4
core-java-lang-oop-constructors
core-java-lang-oop-patterns
core-java-lang-oop-generics