diff --git a/core-java-modules/core-java-lang-math/pom.xml b/core-java-modules/core-java-lang-math/pom.xml
index 551e5db1d5..a229327415 100644
--- a/core-java-modules/core-java-lang-math/pom.xml
+++ b/core-java-modules/core-java-lang-math/pom.xml
@@ -5,6 +5,14 @@
4.0.0
core-java-lang-math
core-java-lang-math
+
+
+ org.projectlombok
+ lombok
+ 1.18.24
+ compile
+
+
jar
diff --git a/core-java-modules/core-java-lang-math/src/main/java/com/baeldung/algorithms/percentage/BigDecimalPercentageCalculator.java b/core-java-modules/core-java-lang-math/src/main/java/com/baeldung/algorithms/percentage/BigDecimalPercentageCalculator.java
new file mode 100644
index 0000000000..91fde335e9
--- /dev/null
+++ b/core-java-modules/core-java-lang-math/src/main/java/com/baeldung/algorithms/percentage/BigDecimalPercentageCalculator.java
@@ -0,0 +1,20 @@
+package com.baeldung.algorithms.percentage;
+
+import lombok.experimental.ExtensionMethod;
+import java.math.BigDecimal;
+import java.util.Scanner;
+
+@ExtensionMethod(FastBigDecimalPercentage.class)
+public class BigDecimalPercentageCalculator {
+ public static void main(String[] args) {
+
+ Scanner in = new Scanner(System.in);
+ System.out.println("Enter obtained marks:");
+ BigDecimal obtained = new BigDecimal(in.nextDouble());
+ System.out.println("Enter total marks:");
+ BigDecimal total = new BigDecimal(in.nextDouble());
+
+ System.out.println("Percentage obtained :"+ obtained.toPercentageOf(total));
+ }
+
+}
diff --git a/core-java-modules/core-java-lang-math/src/main/java/com/baeldung/algorithms/percentage/BigDecimalPercentages.java b/core-java-modules/core-java-lang-math/src/main/java/com/baeldung/algorithms/percentage/BigDecimalPercentages.java
new file mode 100644
index 0000000000..c91cf0e9d4
--- /dev/null
+++ b/core-java-modules/core-java-lang-math/src/main/java/com/baeldung/algorithms/percentage/BigDecimalPercentages.java
@@ -0,0 +1,18 @@
+package com.baeldung.algorithms.percentage;
+
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+
+public class BigDecimalPercentages {
+
+ private static final BigDecimal ONE_HUNDRED = new BigDecimal("100");
+
+ public BigDecimal toPercentageOf(BigDecimal value, BigDecimal total) {
+ return value.divide(total, 4, RoundingMode.HALF_UP).multiply(ONE_HUNDRED);
+ }
+
+ public BigDecimal percentOf(BigDecimal percentage, BigDecimal total) {
+ return percentage.multiply(total).divide(ONE_HUNDRED, 2, RoundingMode.HALF_UP);
+ }
+}
diff --git a/core-java-modules/core-java-lang-math/src/main/java/com/baeldung/algorithms/percentage/FastBigDecimalPercentage.java b/core-java-modules/core-java-lang-math/src/main/java/com/baeldung/algorithms/percentage/FastBigDecimalPercentage.java
new file mode 100644
index 0000000000..f00a9f3e35
--- /dev/null
+++ b/core-java-modules/core-java-lang-math/src/main/java/com/baeldung/algorithms/percentage/FastBigDecimalPercentage.java
@@ -0,0 +1,16 @@
+package com.baeldung.algorithms.percentage;
+
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+
+public class FastBigDecimalPercentage {
+
+ public static BigDecimal toPercentageOf(BigDecimal value, BigDecimal total) {
+ return value.divide(total, 4, RoundingMode.HALF_UP).scaleByPowerOfTen(2);
+ }
+
+ public static BigDecimal percentOf(BigDecimal percentage, BigDecimal total) {
+ return percentage.multiply(total).scaleByPowerOfTen(-2);
+ }
+
+}
diff --git a/core-java-modules/core-java-lang-math/src/test/java/com/baeldung/algorithms/percentage/BigDecimalPercentageUnitTest.java b/core-java-modules/core-java-lang-math/src/test/java/com/baeldung/algorithms/percentage/BigDecimalPercentageUnitTest.java
new file mode 100644
index 0000000000..dac2cb4de6
--- /dev/null
+++ b/core-java-modules/core-java-lang-math/src/test/java/com/baeldung/algorithms/percentage/BigDecimalPercentageUnitTest.java
@@ -0,0 +1,27 @@
+package com.baeldung.algorithms.percentage;
+
+import org.hamcrest.number.BigDecimalCloseTo;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.math.BigDecimal;
+
+public class BigDecimalPercentageUnitTest {
+ private BigDecimalPercentages pc = new BigDecimalPercentages();
+
+
+ @Test
+ public void shouldConvertToPercentageOfTotal(){
+ BigDecimalCloseTo expected = new BigDecimalCloseTo(new BigDecimal(5.05), new BigDecimal(0.001));
+ Assert.assertTrue("Result not as expected",expected.matchesSafely(
+ pc.toPercentageOf(new BigDecimal(50.5),new BigDecimal(1000))));
+ }
+
+ @Test
+ public void shouldCalculatePercentageOfTotal(){
+ BigDecimalCloseTo expected = new BigDecimalCloseTo(new BigDecimal(31.40), new BigDecimal(0.001));
+ Assert.assertTrue("Result not as expected",expected.matchesSafely(
+ pc.percentOf(new BigDecimal(3.14),new BigDecimal(1000))));
+ }
+
+}
diff --git a/core-java-modules/core-java-lang-math/src/test/java/com/baeldung/algorithms/percentage/FastBigDecimalPercentageUnitTest.java b/core-java-modules/core-java-lang-math/src/test/java/com/baeldung/algorithms/percentage/FastBigDecimalPercentageUnitTest.java
new file mode 100644
index 0000000000..dd97e5881c
--- /dev/null
+++ b/core-java-modules/core-java-lang-math/src/test/java/com/baeldung/algorithms/percentage/FastBigDecimalPercentageUnitTest.java
@@ -0,0 +1,27 @@
+package com.baeldung.algorithms.percentage;
+
+import org.hamcrest.number.BigDecimalCloseTo;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.math.BigDecimal;
+
+public class FastBigDecimalPercentageUnitTest {
+ private FastBigDecimalPercentage pc = new FastBigDecimalPercentage();
+
+
+ @Test
+ public void shouldConvertToPercentageOfTotal(){
+ BigDecimalCloseTo expected = new BigDecimalCloseTo(new BigDecimal(5.05), new BigDecimal(0.001));
+ Assert.assertTrue("Result not as expected",expected.matchesSafely(
+ pc.toPercentageOf(new BigDecimal(50.5),new BigDecimal(1000))));
+ }
+
+ @Test
+ public void shouldCalculatePercentageOfTotal(){
+ BigDecimalCloseTo expected = new BigDecimalCloseTo(new BigDecimal(31.40), new BigDecimal(0.001));
+ Assert.assertTrue("Result not as expected",expected.matchesSafely(
+ pc.percentOf(new BigDecimal(3.14),new BigDecimal(1000))));
+ }
+
+}