diff --git a/core-java-modules/core-java-lang-3/src/main/java/com/baeldung/comparedouble/DoubleComparator.java b/core-java-modules/core-java-lang-3/src/main/java/com/baeldung/comparedouble/DoubleComparator.java index d0bde4172ecd..bbd9ae5a02d3 100644 --- a/core-java-modules/core-java-lang-3/src/main/java/com/baeldung/comparedouble/DoubleComparator.java +++ b/core-java-modules/core-java-lang-3/src/main/java/com/baeldung/comparedouble/DoubleComparator.java @@ -1,8 +1,11 @@ package com.baeldung.comparedouble; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.util.Comparator; public class DoubleComparator implements Comparator { + private double epsilon; public DoubleComparator(double epsilon) { @@ -19,4 +22,12 @@ public int compare(Double d1, Double d2) { return 1; // d1 is greater than d2 } } + + public static boolean areEqual(double d1, double d2, int decimalPlaces) { + BigDecimal bd1 = BigDecimal.valueOf(d1) + .setScale(decimalPlaces, RoundingMode.HALF_UP); + BigDecimal bd2 = BigDecimal.valueOf(d2) + .setScale(decimalPlaces, RoundingMode.HALF_UP); + return bd1.equals(bd2); + } } \ No newline at end of file diff --git a/core-java-modules/core-java-lang-3/src/test/java/com/baeldung/comparedouble/CompareDoubleUnitTest.java b/core-java-modules/core-java-lang-3/src/test/java/com/baeldung/comparedouble/CompareDoubleUnitTest.java index accd2de32f92..929f58d60c99 100644 --- a/core-java-modules/core-java-lang-3/src/test/java/com/baeldung/comparedouble/CompareDoubleUnitTest.java +++ b/core-java-modules/core-java-lang-3/src/test/java/com/baeldung/comparedouble/CompareDoubleUnitTest.java @@ -1,11 +1,14 @@ package com.baeldung.comparedouble; import com.google.common.math.DoubleMath; + import org.apache.commons.math3.util.Precision; import org.junit.Test; +import static com.baeldung.comparedouble.DoubleComparator.areEqual; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertEquals; +import static org.junit.jupiter.api.Assertions.assertTrue; public class CompareDoubleUnitTest { @@ -36,7 +39,6 @@ public void givenDoubleValuesThatShouldHaveSameValue_whenUsingGuavaFuzzyComparis double epsilon = 0.000001d; - assertThat(DoubleMath.fuzzyEquals(d1, d2, epsilon)).isTrue(); } @@ -47,7 +49,6 @@ public void givenDoubleValuesThatShouldHaveSameValue_whenUsingCommonsMathCompari double epsilon = 0.000001d; - assertThat(Precision.equals(d1, d2, epsilon)).isTrue(); assertThat(Precision.equals(d1, d2)).isTrue(); } @@ -77,4 +78,13 @@ public void givenTwoEqualDoubleValues_whenUseComparator_thenReturnsZero() { int result = comparator.compare(d1, d2); assertEquals(0, result); } + + @Test + public void givenTwoDoubleValues_whenUseSetScale_thenReturnAsExpected() { + double d1 = 0.7999999999999999; + double d2 = 0.8; + + assertTrue(areEqual(d1, d2, 1), "Should be equal up to 1 decimal place"); + assertTrue(areEqual(d1, d2, 2), "Should be equal up to 2 decimal places"); + } } \ No newline at end of file