Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/313.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Can';t除以零分数_Java_Math - Fatal编程技术网

Java Can';t除以零分数

Java Can';t除以零分数,java,math,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.ja

所以我有一个简单的入学申请。它对分数进行减法、除法、乘法和加法运算

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

所以我知道我的bug在哪里,出了什么问题,但我不知道如何解决这个问题。有人给我一些建议吗

    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(0384)
,即在
reduce
中,
i
0
开头。您可以打印“error”(在本例中这并不是一个真正的错误),但无论如何都要继续

看起来,在
reduce
中,您试图通过将
i
作为
noemer
teller
中的较低者开始计算,并将其减少,直到它成为两者的除数。但是如果这两个函数中有一个是
0
,那么这将失败,就像
Breuk(0384)
的情况一样。要正确处理这种情况,您必须从两者中的较高者开始,如
0%384==0
,但
384%0==ERROR
,即

    int i = Math.max(Math.abs(noemer), Math.abs(teller));
或者,您可以使用来获得最大公约数

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
当您
%i
/i
时,请检查
i
是否为0。如果是这样,处理它(你决定如何处理)。你有一个
Breuk(0384)
,即
i
0
开头。您可能会打印“error”(在本例中这并不是一个真正的错误),但无论如何都会继续。如果
noemer
0
,您应该将其减少到
0/1
@tobias_k是的,这是真的,所以我只需更改If来减少它,并使在else?中的while变得完美!这是有效的。你能详细介绍一下int gcd(a,b)的工作原理吗?谢谢,这对我很有帮助!
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);
}