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)))); + } + +}