Fixed method "doubleValue()".
Implementation still assumed that only the numerator can be negative.
Closes #69. [Thanks to "bkrogh" for reporting failing use-cases.]
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 4405d49..d73d720 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
@@ -662,8 +662,9 @@
return 0L;
}
- final long sign = numerator.signum() == -1 ? 1L : 0L;
+ final long sign = (numerator.signum() * denominator.signum()) == -1 ? 1L : 0L;
final BigInteger positiveNumerator = numerator.abs();
+ final BigInteger positiveDenominator = denominator.abs();
/*
* The most significant 1-bit of a non-zero number is not explicitly
@@ -678,8 +679,8 @@
* are not relevant for the significand of the prospective binary
* floating-point value.
*/
- final int denRightShift = denominator.getLowestSetBit();
- final BigInteger divisor = denominator.shiftRight(denRightShift);
+ final int denRightShift = positiveDenominator.getLowestSetBit();
+ final BigInteger divisor = positiveDenominator.shiftRight(denRightShift);
/*
* Now, we're going to calculate the (significandLength + 2) most
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 162d567..5d77884 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
@@ -183,6 +183,9 @@
Assertions.assertEquals(0d, BigFraction.ZERO.doubleValue(), 0d);
assertDoubleValue(0.5, 1, 2);
+ assertDoubleValue(-0.5, -1, 2);
+ assertDoubleValue(-0.5, 1, -2);
+ assertDoubleValue(0.5, -1, -2);
assertDoubleValue(1.0 / 3.0, 1, 3);
//NUMBERS-120