2017-02-18 2 views
1

Je suis débutant en Java et c'est la première fois que j'utilise une interface comparable. Je ne comprends pas pourquoi il revient à zéro quand on compare r1 et r2. Quelqu'un peut-il m'expliquer ce qui ne va pas avec mon code? Je vous remercie.Implémentation d'une interface comparable à la classe rationnelle (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

Renvoie zéro si la différence absolue entre les doubles est inférieure à 1, par ex. (1/3) - (1/2). Utilisez 'Double.compare'. –

+0

vous pouvez comparer 'getNum() * rhs.getDenom()' et 'rhs.getNum() * getDenom()' et éviter d'utiliser double du tout. Vous voulez toujours utiliser les valeurs 'long' et' Long.compare (a, b) ' –

+0

@AndyTurner Ohh je vois, merci. –

Répondre

2

Cette formule

return (int) (r1 - r2); 

produit zéro lorsque la différence entre r1 et r2 est inférieure à 1, ce qui est le cas que vous testez.

Puisque les deux dénominateurs sont positifs par la construction de votre classe, vous pouvez traverser-multiplier et soustrayez sans utiliser la division du tout:

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

Utilisez long pour éviter les débordements sur la multiplication.

+0

Merci pour l'explication! –

+0

Très bien, merci pour l'info. Je cherchais comment faire, je m'habitue toujours au site –

+0

"Puisque les deux dénominateurs sont positifs par construction" La multiplication croisée fonctionnerait toujours si elle était négative; juste pas avec zéro. –