2017-02-18 2 views
1

Ich bin ein Anfänger in Java und dies ist das erste Mal, dass ich vergleichbare Schnittstelle benutze. Ich verstehe nicht, warum es immer Null zurückgibt, wenn man r1 und r2 vergleicht. Kann mir jemand erklären, was mit meinem Code nicht stimmt? Vielen Dank.Implementierung einer vergleichbaren Schnittstelle zu rational Klasse (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

Es gibt Null zurück, wenn die absolute Differenz zwischen den Doppelpunkten kleiner als 1 ist, z. (1/3) - (1/2). Verwende 'Double.compare'. –

+0

können Sie 'getNum() * rhs.getDenom()' und 'rhs.getNum() * getDenom()' vergleichen und vermeiden, double zu verwenden. Sie wollen immer noch 'long' Werte und' Long.compare (a, b) ' –

+0

@AndyTurner Ohh ich sehe, danke. –

Antwort

2

Diese Formel

return (int) (r1 - r2); 

erzeugt Null, wenn die Differenz zwischen r1 und r2 weniger als 1 ist, was der Fall ist, die Sie testen.

Da beiden Nenner durch den Bau der Klasse positiv sind, können Sie überqueren-Multiplikation und Subtraktion ohne überhaupt mit Teilung:

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

Verwenden long auf Multiplikation überfüllt zu vermeiden.

+0

Danke für die Erklärung! –

+0

Okay, danke für die Info. Ich suchte, wie man das macht, gewöhnt mich immer noch an die Seite –

+0

"Da beide Nenner durch Konstruktion positiv sind" würde die Kreuzmultiplikation immer noch funktionieren, wenn sie negativ sind; nur nicht mit Null. –

Verwandte Themen