首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java Rational实验室

Java Rational实验室
EN

Stack Overflow用户
提问于 2016-02-25 01:05:24
回答 1查看 1.5K关注 0票数 0

我似乎不知道我的代码出了什么问题。我注释了减()方法,以查看它是否适用于未还原的分数(我不认为这个方法有效),对于第一个方法,它确实有效,但是当它达到两位数时,当它达到两位数时,我就不知道为什么它不工作了。

代码语言:javascript
复制
public class Rational implements Comparable<Rational> {
private int numerator, denominator;

public Rational() { numerator = 1; denominator = 1; }
public Rational(int num, int denom) { numerator = num; denominator = denom; }

public void setRational(int num, int denom) { setNumerator(num); setDenominator(denom); }
public void setNumerator(int num) { numerator = num; }
public void setDenominator(int denom) { denominator = denom; }

public int getNumerator() { return numerator; }
public int getDenominator() { return denominator; }

public void reduce() {
    setNumerator(this.numerator / gcd(this.numerator, this.denominator));
    setDenominator(this.denominator / gcd(this.numerator, this.denominator));
}
public int gcd(int num1, int num2) {
    if (num2 == 0) return num1;
    return gcd(num2,num1 % num2);
}

public Object clone() { return new Rational(getNumerator(), getDenominator()); }
public boolean equals(Object obj){ return this.compareTo((Rational)obj) == 0; }

public void add(Rational other) {
    this.setNumerator( (this.getNumerator() * other.denominator ) + ( other.numerator * this.getDenominator() ));
    this.setDenominator( this.getDenominator() * other.denominator );
    //reduce();
}

public void sub(Rational other) {
    numerator = ( this.getNumerator() * other.getDenominator() ) - ( other.getNumerator() * this.getDenominator() );
    denominator = ( this.getDenominator() * other.getDenominator() );
    //reduce();
}

public void mult(Rational other) {
    numerator = ( this.getNumerator() * other.getNumerator() );
    denominator = ( this.getDenominator() * other.getDenominator() );
    //reduce();
}

public void div(Rational other) {
    numerator = (this.getNumerator() * other.getDenominator());
    denominator = (this.getDenominator() * other.getNumerator());
    //reduce();
}

public int compareTo(Rational other) {
    reduce();
    other.reduce();

    if ( this.getDenominator() < other.getDenominator() ) {
        return -1;
    }
    else if ( this.getDenominator() == other.getDenominator() ) {
        if( this.getNumerator() < other.getNumerator() ) {
            return -1;
        }
        else if( this.getNumerator() > other.getNumerator() ) {
            return 1;
        }
        else return 0;
    }
    else return 1;
}

public String toString() {
    return this.numerator + "/" + this.denominator + "\n";

}}

这位是跑步者

代码语言:javascript
复制
import static java.lang.System.out;
public class RationalRunner {
public static void main(String args[]) {
    Rational test = new Rational();
    out.println("test = " + test);
    Rational newOne = new Rational(3, 4);
    out.println("newOne = " + newOne);
    out.println("test.equals(newOne) = " + test.equals(newOne));
    newOne = (Rational) test.clone();
    out.println("\n\nnewOne after test.clone() = " + newOne);
    out.println("test.equals(newOne) = " + test.equals(newOne));

    Rational rOne = new Rational(1, 2);
    Rational rTwo = new Rational(2, 3);
    out.println("1/2.equals(2/3) = " + rOne.equals(rTwo));
    test.setRational(4, 6);
    out.println("2/3.equals(4/6) = " + rTwo.equals(test));

    out.println("\n\nrOne = " + rOne);
    out.println("rTwo = " + rTwo);
    out.println("rOne.compareTo(rTwo) = " + rOne.compareTo(rTwo));
    out.println("rTwo.compareTo(rOne) = " + rTwo.compareTo(rOne));
    rOne.add(rTwo);
    out.println("\n\nrOne.add(rTwo) = " + rOne);
    rOne.setRational(1, 2);
    rTwo.setRational(1, 3);
    rOne.add(rTwo);
    out.println("\n\n1/2.add(1/3) = " + rOne);

    rOne.setRational(4, 10);
    rTwo.setRational(3, 5);
    rOne.add(rTwo);
    out.println("\n\n4/10.add(3/5) = " + rOne);
    rOne.setRational(2, 10);
    rTwo.setRational(3, 6);
    rOne.add(rTwo);
    out.println("\n\n2/10.add(3/6) = " + rOne);
    //1/4 + 2/8 = 1/2
    rOne.setRational(1, 4);
    rTwo.setRational(2, 8);
    out.println("\n\n1/4.equals(2/8) = " + rOne.equals(rTwo));
    rOne.add(rTwo);
    out.println("\n\n1/4.add(2/8) = " + rOne);

    //1/6 + 2/8 = 5/12
    rOne.setRational(1, 6);
    rTwo.setRational(2, 8);
    out.println("\n\n1/6.equals(2/8) = " + rOne.equals(rTwo));
    rOne.add(rTwo);
    out.println("\n\n1/6.add(2/8) = " + rOne);
}

}

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-02-25 02:23:58

例如,当你将其中一个设置为1/6和2/8时,它会产生14/48的值,而应该是20/48。我尝试过重新键入add方法,并尝试了一种不同的方法,但是它仍然出现在14/48中,我不知道为什么

作为您的示例,当我注释掉.equals()方法时,它返回正确的值。因此,我检查您的.compareTo()方法,并发现,您减少了原始数据。经比较,对rOnerTwo的值进行了修正。

你应该克隆对象并计算它们。

Rational num1 = new Rational(numerator, denominator); Rational num2 = new Rational(other.getNumerator(), other.getDenominator());

我已经改正了:

代码语言:javascript
复制
  public int compareTo(Rational other) {
  //Should create copy constructor
    Rational num1 = new Rational(numerator, denominator);
    Rational num2 = new Rational(other.getNumerator(), other.getDenominator());
    num1.reduce();
    num2.reduce();

    if (num1.getDenominator() < num2.getDenominator()) {
      return -1;
    } else if (num1.getDenominator() == num2.getDenominator()) {
      if (num1.getNumerator() < num2.getNumerator()) {
        return -1;
      } else if (num1.getNumerator() > num2.getNumerator()) {
        return 1;
      } else {
        return 0;
      }
    } else {
      return 1;
    }
  }

P/s:我只是看看你的例子。因此,任何计算器都是错误的,你可以用同样的方式进行修正。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35616346

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档