在构建有理数的对象时

时间:2015-11-13 05:39:25

标签: java

 <form>
        <input type="number" name="latitude" >
        <input type="number" name="longitude" >

        <input type="button" onclick="ShowMap(latitude.value,longitude.value)" value="ShowMap"/>
    </form>

我面临的问题是我不明白为什么这不起作用而给我一个错误。

public class Rational {
    int num, denom; /*I'm building an object named "Rational, which takes in two int values, num and denom, and represent them as a rational number(num/denom)*/
    public Rational(int a, int b){//this is the constructor
        this.num = a;
        this.denom = b;

    }
public Rational(){//this is just another form of constructor
    this.num = 0;
    this.denum = 0;

}
public static void printRational(Rational x){/*this is the method that prints the rational number in a fractional format*/
 System.out.println(x.num+"/"+x.denom);
}
public static int gcd(int a, int b){/*this is the method which finds the greatest common denominator of numerator of denominator. This will be used to simplify the fraction*/
    if(b == 0){
        return a;
    }
    else{
        return gcd(b, a%b);
    }
}
public static Rational add(Rational x, Rational y){/*this is a method which adds the two rational numbers(or objects) together, then simplify it utilizing the gcd method*/
    Rational z = new Rational();
    z.denom = (x.denom * y.denom);
    z.num = y.num*x.denom + x.num*y.denom;
    z.denom = z.denom/gcd(z.num, z.denom);
    z.num = z.num/gcd(z.num, z.denom);
    return z;

}
public static void main(String[] args) {
        Rational y = new Rational(1, 2); //1st Rational Object: y
        Rational z = new Rational(2, 6); //2nd Rational Object: z
        printRational(add(y, z)); //implementing the method
        //result? so far so good. I get the correct result
    }

}

为什么这会给我一个错误消息:“线程中的异常”main“java.lang.ArithmeticException:/ by 0     在Rational.add(Rational.java:47)     在Rational.main(Rational.java:58)“当对象的实例是public static Rational add(Rational x, Rational y){ Rational z = new Rational(); int a = (x.denom * y.denom); int b = y.num*x.denom + x.num*y.denom; z.denom = a/gcd(z.num, z.denom); z.num = b/gcd(z.num, z.denom); return z; } 类型时,我将临时性存储到int请帮助我,如果你看到我不知道的话看!!谢谢。

2 个答案:

答案 0 :(得分:2)

当你说“它不工作”时,我不知道究竟是什么问题。如果你能分辨它给出的错误会有所帮助。但是,根据您的说法,可能是因为您尚未初始化 z.num z.denom 并将它们发送到 gcd() ??它们都是零,因为它们是 原始数据类型“int” 所以你的 gcd方法将返回0 并导致例外。

public static Rational add(Rational x, Rational y){
  Rational z = new Rational();
  int a = (x.denom * y.denom);
  int b = y.num*x.denom + x.num*y.denom;
  z.denom = a/gcd(z.num, z.denom); <--------------
  z.num = b/gcd(z.num, z.denom); <--------------
  return z; 
}

答案 1 :(得分:0)

在这种情况下,您使用错误的实现来分割gcd,因为数字会发生变化。

z.denom = z.denom/gcd(z.num, z.denom);
z.num = z.num/gcd(z.num, z.denom);//z.denom is changed here.

z.denom可以0,因为它已更改,因此gcd为0,因此也是例外。

所以你能做的就是。

int gcd = gcd(z.num, z.denom);
z.denom /= gcd;
z.num /= gcd;

当num或denom为0时,这也会失败。