所以我有一个简单的学校申请。哪个会对分数进行减法,除法,乘法和加法。
它工作得很好,但现在有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);
答案 0 :(得分:3)
减法的结果为Breuk(0, 384)
,即在reduce
,i
以0
开头。您打印“错误”(在这种情况下这不是真正的错误),但仍然继续。
似乎在reduce
中,您试图通过i
作为noemer
和teller
的较低者来计算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/14
到3/7