我正在尝试在Java中使用分数。
我想要实现算术函数。为此,我首先需要一种规范化函数的方法。我知道在没有通分之前无法将1/6和1/2相加。我将不得不添加1/6和3/6。一个天真的方法是将2/12和6/12相加,然后约分。如何以最小的性能惩罚实现共同分母?哪种算法最好?
第8版(感谢hstoerr):
改进包括:
- equals()方法现在与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;
}
}
我已删除所有先前的版本,感谢以下人员:
compareTo
中使用long
以防止溢出,但乘法仅使用int
。 - maaartinushashCode
。仅定义equals
可能会导致哈希映射中出现非常糟糕的行为(比两者都不定义还要糟糕)。请注意,定义hashCode
需要某种规范化以保持与equals
一致。 - maaartinus