Rational类实现了分数的加减乘除和比较是相等。
主要思想是把分数改写成两个变量,一个分子,一个分母的形式。先约分,然后再根据分数的运算规则分别创建对应的方法,(将问题转化的思想是比较重要的。这里也可以用一个数组来放分子和分母)在test里面调用得出结果。
代码很简单,重复性很高,就不写注释了,值得注意的就是在写括号的时候要清醒一点。
Rational类继承了Number类,Number类是数值包装类的根类,分数分开成分子分母之后实际也就是数值类型,所以就继承他了。
还有就是注意toString,在println里面用加号连接字符串和对象的时候其要用toString来输出。
比如: r1+"+"+r2+"="+r1.add(r2)等价于 r1.toString( )+"+r2.toString( ) + “=” + r1.add(r2).toString( ) .
如果我把下面的toString注释掉输出的是这样的:
输出的是什么呢,点之前是我的包和类的名字@后就不知道了。但是在另一个程序中经过试验发现,当子类中没有toString,但是他的父类里面有个toString,就会输出父类的toString里面的东西,所以记得要覆盖!!! 这个程序可能是Number类里面的啥。
代码:
package abstractClassAndInterfaces;
public class Rational extends Number implements Comparable{
private long numerator=0;
private long denominator=1;
public Rational() {
this(0,1);
}
public Rational(long numerator,long denominator) {
long gcd=gcd(numerator,denominator);
this.numerator=((denominator>0)?1:-1)*numerator/gcd;
this.denominator=Math.abs(denominator)/gcd;
}
private static long gcd(long n,long d) {
long n1=Math.abs(n);
long n2=Math.abs(d);
int gcd=1;
for(int k=1 ; k<=n1 && k<=n2 ; k++) {
if(n1%k==0&&n2%k==0) {
gcd=k;
}
}
return gcd;
}
public long getNumerator() {
return numerator;
}
public long getDenominator() {
return denominator;
}
public Rational add(Rational secondRational) {
long n=numerator*secondRational.getDenominator()+denominator*secondRational.getNumerator();
long d=denominator*secondRational.getDenominator();
return new Rational(n,d);
}
public Rational subtract(Rational secondRational) {
long n=numerator*secondRational.getDenominator()-denominator*secondRational.getNumerator();
long d=denominator*secondRational.getDenominator();
return new Rational(n,d);
}
public Rational multiply(Rational secondRational) {
long n=numerator*secondRational.getDenominator();
long d=denominator*secondRational.getDenominator();
return new Rational(n,d);
}
public Rational divide(Rational secondRational) {
long n=numerator*secondRational.getDenominator();
long d=denominator*secondRational.getDenominator();
return new Rational(n,d);
}
public String toString() {
if(denominator==1)
return numerator+"";
else
return numerator+"/"+denominator;
}
public boolean equals(Object parm1) {
if((this.subtract((Rational)(parm1))).getNumerator()==0)
return true;
else
return false;
}
public int intValue() {
return (int)doubleValue();
}
public float floatValue() {
return (float)doubleValue();
}
public double doubleValue() {
return numerator*1.0/denominator;
}
public long longValue() {
return (long)doubleValue();
}
public int comparaTo(Object o) {
if ( ( this.subtract ( (Rational) o ) ) . getNumerator ( ) >0 )
return 1;
else if( ( this.subtract ( (Rational) o )) . getNumerator ( ) <0 )
return -1;
else
return 0;
}
}
测试代码:
package abstractClassAndInterfaces;
public class TestRationalClass {
public static void main(String[] args) {
// TODO 自动生成的方法存根
Rational r1=new Rational(4,2);
Rational r2=new Rational(2,3);
System.out.println(r1+"+"+r2+"="+r1.add(r2));
System.out.println(r1+"-"+r2+"="+r1.subtract(r2));
System.out.println(r1+"*"+r2+"="+r1.multiply(r2));
System.out.println(r1+"/"+r2+"="+r1.divide(r2));
System.out.println(r2+"is"+r2.doubleValue());
System.out.println(r2+"is"+r2.longValue());
System.out.println("r1=r2 is" +r1.equals(r2));
}
}
结果: