2015-04-14 54 views
2

所以我有一個簡單的學校申請。減法,除法,相乘和相加的分數。不能被零分數分數

它的工作相當不錯,但現在有1分數,我得到一個錯誤。 分數:16分之28 - 24分之42

Exception in thread "main" java.lang.ArithmeticException:/by zero 
at sample.Breuk.reduce(Breuk.java:70) 
at sample.Breuk.subtract(Breuk.java:44) 
at sample.Main.main(Main.java:15) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
at java.lang.reflect.Method.invoke(Method.java:483) 
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134) 

讓我去哪裏出了問題行了,它原來是在減去分數。

現在我計算的分數(十六分之二十八 - 24分之42),結果= 0

所以我知道我的錯誤是什麼,是哪裏錯了,但我不知道如何解決這個。有人對我有一些提示?

public Breuk subtract(Breuk other){ 
    int d = teller * other.teller; 
    int n1 = noemer * other.teller; 
    int n2 = other.noemer * teller; 
    Breuk b = new Breuk(n1-n2,d); 
    b.reduce(); 
    return b; 
} 

    private void reduce() { 
     int i = Math.min(Math.abs(noemer), Math.abs(teller)); 
      if (i == 0) { 
       System.out.println("Error"); 
      } 
      while ((noemer % i != 0) || (teller % i != 0)) //BUG IS HERE// 
       i--; 
      noemer = noemer/i; 
      teller = teller/i; 
    } 
} 

MAIN:

Breuk a = new Breuk(28,16); 
    Breuk b = new Breuk(42,24); 
    Breuk g = a.subtract(b); // Breuk A - Breuk b 
    System.out.println(a + " - " + b + " = "+ g); 
+0

當你'%i'或'/ i',檢查是否'i'不爲0。如果是這樣,處理它(你決定如何)。 – Maroun

+3

你有一個'Breuk(0,384)',也就是'i'開始爲'0'。你可能會打印「錯誤」(在這種情況下,這不是一個錯誤),但是仍然繼續。如果'noemer'爲'0',則應該減少到'0/1'。 –

+0

@tobias_k是的,這是真的,所以我只需要改變,如果減少它,並在一個其他的? – Lozeputten

回答

3

減法的結果是Breuk(0, 384),即reducei開始作爲0。你打印「錯誤」(在這種情況下這不是一個錯誤),但是繼續。

好像在reduce你正在試圖通過與inoemerteller下部開始,減少它,直到它計算greatest common divisor是兩者的除數。但是如果其中一個是0,那麼這將失敗,如Breuk(0, 384)的情況。爲了讓這種情況下是正確的,你必須與兩個更高開始,爲0 % 384 == 0,但384 % 0 == ERROR,即

int i = Math.max(Math.abs(noemer), Math.abs(teller)); 

或者,你可以只使用Euclid's Algorithm獲得最大公約數。

private void reduce() { 
    int gcd = gcd(noemer, teller); 
    noemer /= gcd; 
    teller /= gcd; 
} 

private int gcd(int a, int b) { 
    return b == 0 ? a : gcd(b, a % b); 
} 

雙方將分數0/384正確減少0/1和,例如,6/143/7

+0

完美!這是行得通的。你可以詳細闡述一下int gcd(a,b)是如何工作的 – Lozeputten

+0

謝謝,這可以幫助我很多! – Lozeputten