不能除以零分数

时间:2015-04-14 12:40:26

标签: java math

所以我有一个简单的学校申请。哪个会对分数进行减法,除法,乘法和加法。

它工作得很好,但现在有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;
    }
}

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);

1 个答案:

答案 0 :(得分:3)

减法的结果为Breuk(0, 384),即在reducei0开头。您打印“错误”(在这种情况下这不是真正的错误),但仍然继续。

似乎在reduce中,您试图通过i作为noemerteller的较低者来计算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