Java 有理数类 分数类 Rational类的设计与实现

时间:2022-06-25 10:19:16

要实现Rational类的加减乘除,要实现其可比较性,要覆盖toString()方法,要实现不同数据类型的转换等。

  1 package chapter14;
  2 
  3 public class Rational extends Number implements Comparable {
  4     private long numerator=0;
  5     private long denominator=1;
  6     
  7     public Rational(){
  8         this(0,1);
  9     }
 10     public Rational(long numerator, long denominator) {
 11         // TODO Auto-generated constructor stub
 12         long gcd=gcd(numerator,denominator);
 13         this.numerator=((denominator>0)?1:-1)*numerator/gcd;
 14         this.denominator=Math.abs(denominator)/gcd;
 15     }
 16 
 17     private static long gcd(long n, long d) {
 18         // TODO Auto-generated method stub
 19         long n1=Math.abs(n);
 20         long n2=Math.abs(d);
 21         int gcd=1;
 22         
 23         for(int k=1;k<=n1&&k<=n2;k++){
 24             if(n1%k==0&&n2%k==0)
 25                 gcd=k;
 26         }
 27         return gcd;
 28     }
 29     
 30     public long getNumerator(){
 31         return numerator;
 32     }
 33     public long getDenominator(){
 34         return denominator;
 35     }
 36     
 37     public Rational add(Rational secondRational){
 38         long n=numerator*secondRational.getDenominator()+
 39                 denominator*secondRational.getNumerator();
 40         long d=denominator*secondRational.getDenominator();
 41         return new Rational(n,d);
 42     }
 43     
 44     public Rational subtract(Rational secondRational){
 45         long n=numerator*secondRational.getDenominator()-
 46                 denominator*secondRational.getNumerator();
 47         long d=denominator*secondRational.getDenominator();
 48         return new Rational(n,d);
 49     }
 50     
 51     public Rational multiply(Rational sR){
 52         long n=numerator*sR.getNumerator();
 53         long d=denominator*sR.getDenominator();
 54         return new Rational(n,d);
 55     }
 56     
 57     public Rational divide(Rational sR){
 58         long n=numerator*sR.denominator;
 59         long d=denominator*sR.numerator;
 60         return new Rational(n,d);
 61     }
 62     
 63     public String toString(){
 64         if(denominator==1)
 65             return numerator+"";
 66         else
 67             return numerator+"/"+denominator;
 68     }
 69     
 70     public boolean equals(Object parm1){
 71         if((this.subtract((Rational)(parm1))).getNumerator()==0)
 72             return true;
 73         else 
 74             return false;
 75     }
 76     
 77     
 78     
 79     @Override
 80     public int compareTo(Object o) {
 81         // TODO Auto-generated method stub
 82         if((this.subtract((Rational)o)).getNumerator()>0)
 83                 return 1;
 84         else if((this.subtract((Rational)o)).getNumerator()<0)
 85             return -1;
 86         else
 87             return 0;
 88     }
 89 
 90     @Override
 91     public int intValue() {
 92         // TODO Auto-generated method stub
 93         return (int)doubleValue();
 94     }
 95 
 96     @Override
 97     public long longValue() {
 98         // TODO Auto-generated method stub
 99         return (long)doubleValue();
100     }
101 
102     @Override
103     public float floatValue() {
104         // TODO Auto-generated method stub
105         return (float)doubleValue();
106     }
107 
108     @Override
109     public double doubleValue() {
110         // TODO Auto-generated method stub
111         return numerator*1.0/denominator;
112     }
113 
114 
115     
116 
117 }

  有理数封装在Rational对象中。在机器内部,有理数总表示为它的最简形式,分子决定有理数的符号,分母总为正数。

  gcd()方法是私有静态的。

  Object类中的toString方法和equals方法在Rational类中被覆盖。toString()方法以numerator/denominator的形式返回一个Rational对象的字符串表示。