Saturday, January 10, 2009

Add, Multiply, Divide Numbers in Fractional Format

Here is a way to do fractional calculations in Java. This might be useful when you want to get the exact values for some arithmetic operations like division. You can keep the result as a fractional number and to the operations what ever you like. i.e. add, subtract, multiply and divide.

Here are two classes named Fraction.java and Util.java. As an example you can create the fractional number 7/8 using the constructor Fraction("8", "7"). There are many other constructors too in the Fraction class. If you want to get 10 as a fractional number, i.e. 10/1, you can use the contructor new Fraction("10").

In order to add two fractional numbers a and b, you can use Util.add(a, b) method. Likewise you can to subtraction, multiplication and division. Please refer the code, it might be useful to understand the usage.

Fraction.java
public class Fraction {
   
    private Long denominator;
    private Long numerator;
    /** Creates a new instance of Fraction */
    public Fraction(String denominator, String numerator) {
        this(new Long(denominator), new Long(numerator));
    }
   
    public Fraction(Long denominator, Long numerator) {
        long gcd = Util.gcd(denominator, numerator);       
        this.denominator = denominator / gcd;
        this.numerator = numerator /gcd;
    }
   
    public Fraction(String number) {
        this.denominator = new Long("1");
        this.numerator = new Long(number);
    }
   
    public Fraction(long number) {
        this.denominator = new Long("1");
        this.numerator = new Long(number);
    }

    public Long getDenominator() {
        return denominator;
    }

    public Long getNumerator() {
        return numerator;
    }
}
Util.java
public class Util {
   
    /** Creates a new instance of Util */
    public Util() {
    }
  
    public static long gcd(Long a, Long b) {      
        if (b==0)
            return a;
        else
            return gcd(b, a % b);
    }
   
    public static long lcm(Long a, Long b) {
        return (a/gcd(a, b))*b;
    }
   
    // (a + b)
    public static Fraction add(Fraction a, Fraction b) {
       
        Long denominator = lcm(a.getDenominator(), b.getDenominator());
        Long numerator = a.getNumerator()*(denominator/a.getDenominator()) +
                b.getNumerator()*(denominator/b.getDenominator());
        return new Fraction(denominator, numerator);
    }
   
    // (a - b)
    public static Fraction substract(Fraction a, Fraction b) {
       
        Long denominator = lcm(a.getDenominator(), b.getDenominator());
        Long numerator = a.getNumerator()*(denominator/a.getDenominator()) -
                b.getNumerator()*(denominator/b.getDenominator());
        return new Fraction(denominator, numerator);
    }
   
    // (a * b)
    public static Fraction multiply(Fraction a, Fraction b) {
        return new Fraction(a.getDenominator() * b.getDenominator(), a.getNumerator() * b.getNumerator());
    }
   
    // (a / b)
    public static Fraction divide(Fraction a, Fraction b) {
        return new Fraction(a.getDenominator() * b.getNumerator(), a.getNumerator() * b.getDenominator());
    }
   
}

How to find gcd and lcm in Java

Here is the easiest and efficient way to get the Greatest Common Divisor(gcd) and Least Common Multiple(lcm) in Java. This algorithm could be used for any language. Here I have used Long data type. You can use integer as needed.
public static long gcd(long a, long b) {      
    if (b==0)
        return a;
    else
        return gcd(b, a % b);
}
public static long lcm(long a, long b) {
    return (a / gcd(a, b)) * b;
}