¿La mejor manera de representar una fracción en Java?

Estoy tratando de trabajar confracciones en Java

Quiero implementar funciones aritméticas. Para esto, primero requeriré una forma de normalizar las funciones. Sé que no puedo agregar 1/6 y 1/2 hasta que tenga un denominador común. Tendré que agregar 1/6 y 3/6. Un enfoque ingenuo me haría agregar 2/12 y 6/12 y luego reducir. ¿Cómo puedo lograr un denominador común con la menor penalización de rendimiento? ¿Qué algoritmo es mejor para esto?

Versión 8 (gracias ahstoerr):

Las mejoras incluyen:

el método equals () ahora es consistente con el 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;
    }
}

He eliminado todas las versiones anteriores. Mi agradecimiento a:

Dave RaycletusduffymoJamesMilhousOscar ReyesJason SFrancisco CanedoProgramador ilegalBeska

Respuestas a la pregunta(26)

Su respuesta a la pregunta