繁体   English   中英

实现与合理类的可比接口(java)

[英]Implementing comparable interface to rational class(java)

我是Java的初学者,这是我第一次使用Comparable接口。 我不明白为什么在比较r1和r2时它总是返回零。 有人可以向我解释我的代码有什么问题吗? 谢谢。

public class Rational implements Comparable<Rational>{
private  int num; //numerator
private int denom; //denominator

public Rational() {
 num = 0;
 denom = 1;   
 } 

 public Rational(int num, int denom) {
 if(denom <=0 ){
     throw new ArithmeticException("You cannot divide by a non-positive  number");
 }

 this.num = num;
 this.denom = denom;
 } 

 //returns numerator of this rational number
 public int getNum() {
 return num;
 } 

 //returns denominator of this rational number
 public int getDenom() {
 return denom;
 } 

 public Rational add(Rational rhs) { 
 return new Rational(num*rhs.denom+rhs.num*denom, denom*rhs.denom); 
 } 

 public Rational subtract(Rational rhs) { 
 return new Rational(num*rhs.denom-rhs.num*denom, denom*rhs.denom); 
 } 

 public Rational multiply(Rational rhs) { 
 return new Rational(num*rhs.num, denom*rhs.denom); 
 } 

 public Rational divide(Rational rhs) { 
 return new Rational(num*rhs.denom, denom*rhs.num); 
 }  

 public String toString() {
 String result;
 if (num == 0)
 result = "0";
 else if(denom == 1)
 result = num + "";
 else
 result = num + "/" + denom;
 return result;
 }

 public int compareTo(Rational rhs){
 double r1 = ((double) getNum()/getDenom());
 double r2 =  ((double)rhs.getNum() / rhs.getDenom());
 return (int) (r1 - r2);
 }

public static void main(String[] args) {
     Rational r1 = new Rational(1, 2); // 1/2 
     Rational r2 = new Rational(3, 4); // 3/4  
     Rational result = r1.add(r2); 
     Rational result1 = r1.subtract(r2);
     Rational result2 = r1.multiply(r2);
     Rational result3 = r1.divide(r2);
     System.out.println( "r1 + r2 = " + result + "\n" + "r1 - r2 = " +    result1 + "\n" + "r1*r2 = "+ result2 + "\n" + "r1/r2 = " + result3 + "\n" + (r1.compareTo(r2)));                  
     }
}

这个公式

return (int) (r1 - r2);

r1r2差小于1 ,将产生零,这就是您正在测试的情况。

由于根据类的构建,两个分母都是正的,因此您可以互乘和相减,而无需使用除法:

long a = (long)getNum() * rhs.getDenom();
long b = (long)rhs.getNum() * getDenom();
return Long.compare(a, b);

使用long时间可以避免乘法运算溢出。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM