Melhor maneira de representar uma fração em Java?

Estou tentando trabalhar comfrações em Java.

Eu quero implementar funções aritméticas. Para isso, primeiro exigirei uma maneira de normalizar as funções. Eu sei que não posso adicionar 1/6 e 1/2 até que eu tenha um denominador comum. Vou ter que adicionar 1/6 e 3/6. Uma abordagem ingênua me faria adicionar 2/12 e 6/12 e depois reduzir. Como posso obter um denominador comum com a menor penalidade de desempenho? Qual algoritmo é melhor para isso?

Versão 8 (graças ahstoerr):

As melhorias incluem:

o método equals () agora é consistente com o método compareTo ()
final class Fraction extends Number {
    private int numerator;
    private int denominator;

    public Fraction(int numerator, int denominator) {
        if(denominator == 0) {
            throw new IllegalArgumentException("denominator is zero");
        }
        if(denominator < 0) {
            numerator *= -1;
            denominator *= -1;
        }
        this.numerator = numerator;
        this.denominator = denominator;
    }

    public Fraction(int numerator) {
        this.numerator = numerator;
        this.denominator = 1;
    }

    public int getNumerator() {
        return this.numerator;
    }

    public int getDenominator() {
        return this.denominator;
    }

    public byte byteValue() {
        return (byte) this.doubleValue();
    }

    public double doubleValue() {
        return ((double) numerator)/((double) denominator);
    }

    public float floatValue() {
        return (float) this.doubleValue();
    }

    public int intValue() {
        return (int) this.doubleValue();
    }

    public long longValue() {
        return (long) this.doubleValue();
    }

    public short shortValue() {
        return (short) this.doubleValue();
    }

    public boolean equals(Fraction frac) {
        return this.compareTo(frac) == 0;
    }

    public int compareTo(Fraction frac) {
        long t = this.getNumerator() * frac.getDenominator();
        long f = frac.getNumerator() * this.getDenominator();
        int result = 0;
        if(t>f) {
            result = 1;
        }
        else if(f>t) {
            result = -1;
        }
        return result;
    }
}

Eu removi todas as versões anteriores. Meus agradecimentos a:

Dave RaycletoduffymoJamesMilhousOscar ReyesJason SFrancisco CanedoOutlaw ProgrammerBeska

questionAnswers(26)

yourAnswerToTheQuestion