有理数是由分子、分母以形式a/b表示的数(b!=0)。 Java提供了整
数和浮点数的数据类型,但没有提供有理数的类。本程序实现扩充有理数。
类图如下:
说明:
(1)由于有理数不整数和浮点数有许多共同特征,并且Number类是数值包装类的根类,因此可把有理数类Rational定义为Nnumber抽象类(java.awt.lang)的子类。由于有理数是可以比较的,那么Rational类也应实现Comparable接口
(java.awt.lang) 。
(2)Rational类应实现Nnumber类中的抽象方法intValue、longValue、 floatValue和doubleValue。这些方法返回该有理数的int、 long、 float和double值。
(3)Rational类应实现了Comparable接口中的comparaTo(Object other)方法,将这个有理数和另一个有理数进行比较。
//Rational.java
public class Rational extends Number implements Comparable<Rational>{
private long numerator=0;//分子
private long denominator=1;//分母
public final int addFlag=1;//运算标记
public final int subtractFlag=2;
public final int multiplyFlag=3;
public final int divideFlag=4;
public Rational(){
}
public Rational(long numerator,long denominator){
this.numerator=numerator;
this.denominator=denominator;
}
public long getNumerator(){
return numerator;
}
public long getDenomimator(){
return denominator;
}
//加法
public Rational add(Rational secondRational){
return calculateResult(addFlag,this,secondRational);
}
//减法
public Rational subtract(Rational secondRational){
return calculateResult(subtractFlag,this,secondRational);
}
//乘法
public Rational multiply(Rational secondRational){
return calculateResult(multiplyFlag,this,secondRational);
}
//除法
public Rational divide(Rational secondRational){
return calculateResult(divideFlag,this,secondRational);
}
public String toString(){
return this.numerator+"\\"+this.denominator;
}
public String show(){//假分数处理
if(this.numerator>=this.denominator){
long intpart=this.numerator/this.denominator;
return "Integer part "+intpart+" rational part "+(this.numerator-this.denominator*intpart)+"\\"+this.denominator;
}
return this.numerator+"\\"+this.denominator;
}
//有理数的转换
public int intValue() {
return (int)(numerator/denominator);
}
public long longValue() {
return numerator/denominator;
}
public float floatValue() {
return (float)numerator/denominator;
}
public double doubleValue() {
return (double)numerator/denominator;
}
//统筹运算
private Rational calculateResult(int flag,Rational a, Rational b) {
long numerator=0,denominator=1;
long gcd=gcd(a.getNumerator(),a.getDenomimator());
long numerator1=a.getNumerator()/gcd;
long denominator1=a.getDenomimator()/gcd;
gcd=gcd(b.getNumerator(),b.getDenomimator());
long numerator2=b.getNumerator()/gcd;
long denominator2=b.getDenomimator()/gcd;
if(flag==addFlag) {
numerator1*=denominator2;
numerator2*=denominator1;
numerator=numerator1+numerator2;
denominator=denominator1*denominator2;
gcd=gcd(numerator,denominator);
numerator/=gcd;
denominator/=gcd;
}else if(flag==subtractFlag){
numerator1*=denominator2;
numerator2*=denominator1;
numerator=numerator1-numerator2;
denominator=denominator1*denominator2;
long tempNumerator=numerator>0?numerator:-numerator;
gcd=gcd(tempNumerator,denominator);
numerator/=gcd;
denominator/=gcd;
}else if(flag==multiplyFlag){
numerator=numerator1*numerator2;
denominator=denominator1*denominator2;
gcd=gcd(numerator,denominator);
numerator/=gcd;
denominator/=gcd;
}else if(flag==divideFlag){
numerator=numerator1*denominator2;
denominator=denominator1*numerator2;
gcd=gcd(numerator,denominator);
numerator/=gcd;
denominator/=gcd;
}else{
}
return new Rational(numerator,denominator);
}
//实现接口中的方法
public int compareTo(Rational val) {
long compareToResult=calculateResult(subtractFlag,this,val).getNumerator();
if(compareToResult==0){
return 0;
}
int signum=compareToResult>0?1:-1;
return signum;
}
//最大公约数
private long gcd(long n,long d){
long temp=1;
if (n<d){
temp=n;
n=d;
d=temp;
}
while(temp!=0) { /* 辗转相除法求最大公约数 */
temp=n%d;
n=d;
d=temp;
}
return n;
}
}
//RationalDemo.java
public class RationalDemo{
public static void main(String[] args){
Rational obj1=new Rational(2,2);
Rational obj2=new Rational(5,4);
System.out.println("rational1 "+obj1+"\trational2 "+obj2);
System.out.println("假分数形式:");
System.out.println(obj1+" + "+obj2+"= "+obj1.add(obj2));
System.out.println(obj1+" - "+obj2+"= "+obj1.subtract(obj2));
System.out.println(obj1+" * "+obj2+"= "+obj1.multiply(obj2));
System.out.println(obj1+" / "+obj2+"= "+obj1.divide(obj2));
System.out.println("带分数形式:");
System.out.println(obj1+" + "+obj2+"= "+obj1.add(obj2).show());
System.out.println(obj1+" - "+obj2+"= "+obj1.subtract(obj2).show());
System.out.println(obj1+" * "+obj2+"= "+obj1.multiply(obj2).show());
System.out.println(obj1+" / "+obj2+"= "+obj1.divide(obj2).show());
System.out.println("其它形式:");
System.out.println(obj1+" Integer form : "+obj1.intValue());
System.out.println(obj1+" Long form : "+obj1.longValue());
System.out.println(obj1+" Float form : "+obj1.floatValue());
System.out.println(obj1+" Double form : "+obj1.doubleValue());
System.out.println(">输出1 =输出0 <输出-1");
System.out.println(obj1+" compare "+obj2+" result: "+obj1.compareTo(obj2));
}
}
运行结果: