2015-04-14 2 views
2

Итак, у меня было простое приложение для школы. Который вычитает, делит, умножает и добавляет на фракции.Невозможно делить на ноль Фракции

Это сработало неплохо, но теперь с 1 долей я получаю сообщение об ошибке. Фракция: 28/16 - 42/24

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) 

Так я пошел к линии, где она идет не так, и оказалось, это был вычитанием фракции.

Теперь я вычислил фракции (28/16 - 42/24) и результат = 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; 
    } 
} 

ОСНОВНОЙ:

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 да, это правда, поэтому мне просто нужно изменить if, чтобы уменьшить его и сделать время в другом? – Lozeputten

ответ

3

Результат вычитания Breuk(0, 384), то есть в reduce, i начинается как 0. Вы печатаете «ошибку» (которая в данном случае не является ошибкой), но затем продолжайте в любом случае.

Похоже, в reduce вы пытаетесь вычислить greatest common divisor, начиная с i как нижняя из noemer и teller и не снижая ее, пока она является делителем обоих. Но это не удастся, если один из двух равен 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/14 на 3/7

+0

Отлично! это работает. Не могли бы вы немного подробнее рассказать о int gcd (a, b), как это работает – Lozeputten

+0

Спасибо, это помогает мне много! – Lozeputten

Смежные вопросы