This is an automated email from the ASF dual-hosted git repository.

erans pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-numbers.git


The following commit(s) were added to refs/heads/master by this push:
     new e429d637 NUMBERS-207: Incorrect comparison of negative fractions.
e429d637 is described below

commit e429d6378ca4070623c3abe147b96d0e7e577f70
Author: Gilles Sadowski <gillese...@gmail.com>
AuthorDate: Sat Mar 15 19:58:25 2025 +0100

    NUMBERS-207: Incorrect comparison of negative fractions.
---
 .../main/java/org/apache/commons/numbers/fraction/BigFraction.java    | 4 +++-
 .../src/main/java/org/apache/commons/numbers/fraction/Fraction.java   | 4 +++-
 .../java/org/apache/commons/numbers/fraction/BigFractionTest.java     | 3 +++
 .../test/java/org/apache/commons/numbers/fraction/FractionTest.java   | 3 +++
 4 files changed, 12 insertions(+), 2 deletions(-)

diff --git 
a/commons-numbers-fraction/src/main/java/org/apache/commons/numbers/fraction/BigFraction.java
 
b/commons-numbers-fraction/src/main/java/org/apache/commons/numbers/fraction/BigFraction.java
index 5796b76f..0a34b7dc 100644
--- 
a/commons-numbers-fraction/src/main/java/org/apache/commons/numbers/fraction/BigFraction.java
+++ 
b/commons-numbers-fraction/src/main/java/org/apache/commons/numbers/fraction/BigFraction.java
@@ -1064,7 +1064,9 @@ public final class BigFraction
         // Compare absolute magnitude
         final BigInteger nOd = 
numerator.abs().multiply(other.denominator.abs());
         final BigInteger dOn = 
denominator.abs().multiply(other.numerator.abs());
-        return nOd.compareTo(dOn);
+        return lhsSigNum > 0 ?
+            nOd.compareTo(dOn) :
+            dOn.compareTo(nOd);
     }
 
     /**
diff --git 
a/commons-numbers-fraction/src/main/java/org/apache/commons/numbers/fraction/Fraction.java
 
b/commons-numbers-fraction/src/main/java/org/apache/commons/numbers/fraction/Fraction.java
index 07c384f9..4f89c1eb 100644
--- 
a/commons-numbers-fraction/src/main/java/org/apache/commons/numbers/fraction/Fraction.java
+++ 
b/commons-numbers-fraction/src/main/java/org/apache/commons/numbers/fraction/Fraction.java
@@ -876,7 +876,9 @@ public final class Fraction
         // Multiplication by the signum is equal to the absolute.
         final long nOd = ((long) numerator) * lns * other.denominator * rds;
         final long dOn = ((long) denominator) * lds * other.numerator * rns;
-        return Long.compare(nOd, dOn);
+        return lhsSigNum > 0 ?
+            Long.compare(nOd, dOn) :
+            Long.compare(dOn, nOd);
     }
 
     /**
diff --git 
a/commons-numbers-fraction/src/test/java/org/apache/commons/numbers/fraction/BigFractionTest.java
 
b/commons-numbers-fraction/src/test/java/org/apache/commons/numbers/fraction/BigFractionTest.java
index c1095d22..ae6a6d8a 100644
--- 
a/commons-numbers-fraction/src/test/java/org/apache/commons/numbers/fraction/BigFractionTest.java
+++ 
b/commons-numbers-fraction/src/test/java/org/apache/commons/numbers/fraction/BigFractionTest.java
@@ -254,6 +254,8 @@ class BigFractionTest {
         final BigFraction e = BigFraction.of(1, -2);
         final BigFraction f = BigFraction.of(-1, -2);
         final BigFraction g = BigFraction.of(-1, Integer.MIN_VALUE);
+        final BigFraction h = BigFraction.of(-2, 1);
+        final BigFraction i = BigFraction.of(-1, 1);
 
         Assertions.assertEquals(0, a.compareTo(a));
         Assertions.assertEquals(0, a.compareTo(c));
@@ -272,6 +274,7 @@ class BigFractionTest {
         Assertions.assertEquals(-1, g.compareTo(f));
         Assertions.assertEquals(1, a.compareTo(g));
         Assertions.assertEquals(-1, d.compareTo(g));
+        Assertions.assertEquals(-1, h.compareTo(i)); // JIRA:NUMBERS-207
 
         Assertions.assertEquals(0, BigFraction.of(0, 
3).compareTo(BigFraction.of(0, -2)));
 
diff --git 
a/commons-numbers-fraction/src/test/java/org/apache/commons/numbers/fraction/FractionTest.java
 
b/commons-numbers-fraction/src/test/java/org/apache/commons/numbers/fraction/FractionTest.java
index def672ff..fbc0b514 100644
--- 
a/commons-numbers-fraction/src/test/java/org/apache/commons/numbers/fraction/FractionTest.java
+++ 
b/commons-numbers-fraction/src/test/java/org/apache/commons/numbers/fraction/FractionTest.java
@@ -214,6 +214,8 @@ class FractionTest {
         final Fraction e = Fraction.of(1, -2);
         final Fraction f = Fraction.of(-1, -2);
         final Fraction g = Fraction.of(-1, Integer.MIN_VALUE);
+        final Fraction h = Fraction.of(-2, 1);
+        final Fraction i = Fraction.of(-1, 1);
 
         Assertions.assertEquals(0, a.compareTo(a));
         Assertions.assertEquals(0, a.compareTo(c));
@@ -232,6 +234,7 @@ class FractionTest {
         Assertions.assertEquals(-1, g.compareTo(f));
         Assertions.assertEquals(1, a.compareTo(g));
         Assertions.assertEquals(-1, d.compareTo(g));
+        Assertions.assertEquals(-1, h.compareTo(i)); // JIRA:NUMBERS-207
 
         Assertions.assertEquals(0, Fraction.of(0, 3).compareTo(Fraction.of(0, 
-2)));
 

Reply via email to