title: Using BigInteger to calculate a series
body: <pre><code>import java.math.BigInteger;
  
  public class Rational extends Number implements Comparable {
    // Data fields for numerator and denominator
    private BigInteger numerator = new BigInteger("0");
    private BigInteger denominator = new BigInteger("1");
  
    /** Construct a rational with default properties */
    public Rational() {
      this(BigInteger.valueOf(0), BigInteger.valueOf(1));
    }
  
    /** Construct a rational with specified numerator and denominator */ 
    public Rational(BigInteger numerator, BigInteger denominator) {
      BigInteger gcd = gcd(numerator, denominator);
      this.numerator = BigInteger.valueOf(denominator.signum()).multiply(numerator).divide(gcd);
      this.denominator = this.denominator.abs().divide(gcd); 
    }
  
    /** Find GCD of two numbers */ 
    private static BigInteger gcd(BigInteger n, BigInteger d) {
      BigInteger n1 = n.abs();
      BigInteger n2 = d.abs();
      BigInteger gcd = new BigInteger("1");
  
      for (int k = 1; k &lt;= n1.intValue() &amp;&amp; k &lt;= n2.intValue(); k++) {
        if (n1.intValue() % k == 0 &amp;&amp; n2.intValue() % k == 0)
          gcd = BigInteger.valueOf(k);
      }
  
      return gcd;
    }
  
    /** Return numerator */
    public BigInteger getNumerator() {
      return numerator;
    }
  
    /** Return denominator */
    public BigInteger getDenominator() {
      return denominator;
    }
  
    /** Add a rational number to this rational */
    public Rational add(Rational secondRational) {
      BigInteger n = (numerator.multiply(secondRational.getDenominator())).add(denominator.multiply(secondRational.getNumerator()));
      BigInteger d = denominator.multiply(secondRational.getDenominator());
      return new Rational(n, d); 
    }
  
    /** Subtract a rational number from this rational */
    public Rational subtract(Rational secondRational) {
      BigInteger n = (numerator.multiply(secondRational.getDenominator())).subtract(denominator.multiply(secondRational.getNumerator()));
      BigInteger d = denominator.multiply(secondRational.getDenominator());
      return new Rational(n, d);
    }
  
    /** Multiply a rational number to this rational */
    public Rational multiply(Rational secondRational) {
      BigInteger n = numerator.multiply(secondRational.getNumerator());
      BigInteger d = denominator.multiply(secondRational.getDenominator());
      return new Rational(n, d);
    }
  
    /** Divide a rational number from this rational */
    public Rational divide(Rational secondRational) {
      BigInteger n = numerator.multiply(secondRational.getDenominator());
      BigInteger d = denominator.multiply(secondRational.numerator);
      return new Rational(n, d);
    }
  
    /** Override the toString() method */
    public String toString() {
      if (denominator.intValue() == 1)
        return numerator + "";
      else
        return numerator + "/" + denominator;
    }
  
    /** Override the equals method in the Object class */
  
  
    public boolean equals(Object parm1) {
      if ((this.subtract((Rational)(parm1)).getNumerator()).intValue() == 0) 
          return true;
      else
        return false;
    }
  
    /** Override the abstract intValue method in java.lang.Number */
    public int intValue() {
      return (int)doubleValue();
    }
  
    /** Override the abstract floatValue method in java.lang.Number */
    public float floatValue() {
      return (float)doubleValue();
    }
  
    /** Override the doubleValue method in java.lang.Number */
    public double doubleValue() {
      return numerator.divide(denominator).doubleValue();
    }
  
    /** Override the abstract BigIntegerValue method in java.lang.Number */
    public long longValue() {
      return (long)doubleValue();
    }
  
    /** Override the compareTo method in java.lang.Comparable */
    public int compareTo(Object o) {
      if (((this.subtract((Rational)o)).getNumerator()).intValue() &gt; 0)
        return 1;
      else if (((this.subtract((Rational)o)).getNumerator()).intValue() &lt; 0)
        return -1;
      else
        return 0;
    }
  
    public static void main(String[] args) {
      // Create and initialize two rational numbers r1 and r2.
      Rational r1 = new Rational(BigInteger.valueOf(1), BigInteger.valueOf(2));
      Rational r2 = new Rational(BigInteger.valueOf(1), BigInteger.valueOf(2));
  
      for (int i = 2; i &lt;= 100; i++){
          r2.numerator = BigInteger.valueOf(i);
          r2.denominator = r2.denominator.add(BigInteger.valueOf(1));
  
  
          System.out.println("r2: " + r2.getNumerator() + "/" + r2.getDenominator());
  
          r1 = r1.add(r2);        
      }
      // Display results 
  
      System.out.println("r1: " + r1.getNumerator() + "/" + r1.getDenominator());
    }
  </code></pre>
  
  <p>I have been working on this for a few hours and I absolutely hit a wall.  Goal is to use BigInteger to sum a series of fractions.  For some reason, the numerator and denominator of r2 are equal, when they are supposed to be 1/2.  The end result is also not correct, as the denominator should not be 0.  What am I missing, or what am I doing wrong?</p>