Java Can';t除以零分数
所以我有一个简单的入学申请。它对分数进行减法、除法、乘法和加法运算 它工作得很好,但是现在有了1个分数,我得到了一个错误。 分数:28/16-42/24Java 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
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);
}