2017-02-18 13 views
1

저는 Java의 초보자이며 이것은 Comparable 인터페이스를 처음 사용하는 클래스입니다. r1과 r2를 비교할 때 왜 0을 계속 유지하는지 이해할 수 없습니다. 누군가 내 코드에 문제가 있다고 설명 할 수 있습니까? 고맙습니다. r1r2와 차이가 테스트중인 경우, 이는 이하 1을 때합리적인 클래스 (Java)에 대한 비교 가능한 인터페이스 구현

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)));     
    } 
} 
+3

두 배 사이의 절대 차이가 1보다 작은 경우 0을 반환합니다. (1/3) - (1/2)이다. 'Double.compare'를 사용하십시오. –

+0

'getNum() * rhs.getDenom()'과'rhs.getNum() * getDenom()'을 비교하여 double을 전혀 사용하지 않아도됩니다. 여전히 long 값과 Long.compare (a, b)를 사용하고 싶습니다. –

+0

@AndyTurner 오, 고맙습니다. –

답변

2

이 수식

return (int) (r1 - r2); 

제로를 생성한다. 두 분모는 클래스의 건설에 의해 긍정적이기 때문에

, 당신은 모든 부문을 사용하지 않고 곱셈 건너 뺄 수 있습니다

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

사용 long 곱셈에 넘쳐 방지하기 위해.

+0

설명해 주셔서 감사합니다! –

+0

알겠습니다. 정보를 제공해 주셔서 감사합니다. 나는 그 일을하는 방법을 찾고 있었고 여전히 사이트에 익숙해졌습니다. –

+0

"두 분모가 모두 구성에 의해 양의 값을 갖기 때문에"교차 곱셈은 음수 일 경우 여전히 작동합니다. 단지 0이 아닙니다. –