diff --git a/src/java/org/apache/commons/lang/math/Fraction.java b/src/java/org/apache/commons/lang/math/Fraction.java index 94f5bd697..3fa6a4fed 100644 --- a/src/java/org/apache/commons/lang/math/Fraction.java +++ b/src/java/org/apache/commons/lang/math/Fraction.java @@ -189,9 +189,12 @@ public static Fraction getFraction(int whole, int numerator, int denominator) { } /** - *

Creates a Fraction instance with the 2 parts + *

Creates a reduced Fraction instance with the 2 parts * of a fraction Y/Z.

* + *

For example, if the input parameters represent 2/4, then the created + * fraction will be 1/2.

+ * *

Any negative signs are resolved to be on the numerator.

* * @param numerator the numerator, for example the three in 'three sevenths' @@ -448,12 +451,18 @@ public double doubleValue() { /** *

Reduce the fraction to the smallest values for the numerator and - * denominator, returning the result..

+ * denominator, returning the result.

+ * + *

For example, if this fraction represents 2/4, then the result + * will be 1/2.

* - * @return a new reduce fraction instance, or this if no simplification possible + * @return a new reduced fraction instance, or this if no simplification possible */ public Fraction reduce() { int gcd = greatestCommonDivisor(Math.abs(numerator), denominator); + if (gcd == 1) { + return this; + } return Fraction.getFraction(numerator / gcd, denominator / gcd); } diff --git a/src/test/org/apache/commons/lang/math/FractionTest.java b/src/test/org/apache/commons/lang/math/FractionTest.java index e4f2660b7..89abdc8d7 100644 --- a/src/test/org/apache/commons/lang/math/FractionTest.java +++ b/src/test/org/apache/commons/lang/math/FractionTest.java @@ -615,14 +615,31 @@ public void testReduce() { Fraction f = null; f = Fraction.getFraction(50, 75); - f = f.reduce(); - assertEquals(2, f.getNumerator()); - assertEquals(3, f.getDenominator()); + Fraction result = f.reduce(); + assertEquals(2, result.getNumerator()); + assertEquals(3, result.getDenominator()); + + f = Fraction.getFraction(-2, -3); + result = f.reduce(); + assertEquals(2, result.getNumerator()); + assertEquals(3, result.getDenominator()); + + f = Fraction.getFraction(2, -3); + result = f.reduce(); + assertEquals(-2, result.getNumerator()); + assertEquals(3, result.getDenominator()); + + f = Fraction.getFraction(-2, 3); + result = f.reduce(); + assertEquals(-2, result.getNumerator()); + assertEquals(3, result.getDenominator()); + assertSame(f, result); f = Fraction.getFraction(2, 3); - f = f.reduce(); - assertEquals(2, f.getNumerator()); - assertEquals(3, f.getDenominator()); + result = f.reduce(); + assertEquals(2, result.getNumerator()); + assertEquals(3, result.getDenominator()); + assertSame(f, result); } public void testInvert() {