Sarah
Sarah

Reputation: 43

Why is my multiplying not working?

I have to create a class and a tester program called fraction. A fractions is created and it can be simplified, multiplied, divided, added, and subtracted. When ever I use the multiply method it keeps returning the square of the second multiply and I am not sure why.

  class Fraction{

     private static int numerator;
     private static int denominator;

  public Fraction(int num, int den){
  numerator = num;
  denominator = den;
  }


  public static int getNumerator(){
      return numerator;
  }

  public static int getDenominator(){
     return denominator;
   }

  public static String getFraction(){
     return (numerator + "/" + denominator);
  }

  public static void setNumerator(int x){
    numerator = x;
  }

  public static void setDenominator(int x){
     denominator = x;
  }

  public static Fraction multiply(Fraction fraction, Fraction fractionTwo){
     Fraction newFraction = new Fraction(fraction.getNumerator() * fractionTwo.getNumerator(), fraction.getDenominator() * fractionTwo.getDenominator());
     return reduce(newFraction.getNumerator(), newFraction.getDenominator());
  }

  public static Fraction divide(Fraction fraction, Fraction fractionTwo){
     Fraction newFraction = new Fraction(fraction.getNumerator() * fractionTwo.getDenominator(), fraction.getDenominator() *fractionTwo.getNumerator());
     return reduce(newFraction.getNumerator(), newFraction.getDenominator());

  }

   public static Fraction commonDenominator(Fraction fraction, Fraction fractionTwo){
      int x = 2;
      Fraction multiply = new Fraction(x, x);
      for(x = multiply.getNumerator(); fraction.getDenominator() != fractionTwo.getDenominator(); x++){
          multiply.setNumerator(x);
          multiply.setDenominator(x);

       }
      multiply(multiply, fraction);
      multiply(multiply, fractionTwo);
      Fraction commonDenominator = new Fraction(x, x);
      return commonDenominator;
    }

    public static Fraction addition(Fraction fraction, Fraction fractionTwo){
       Fraction commonDenominator = commonDenominator(fraction, fractionTwo);
       Fraction fractionAdd = multiply(fraction, commonDenominator);
       Fraction fractionAddTwo = multiply(fractionTwo, commonDenominator);
       Fraction newFraction = new Fraction((fractionAddTwo.getNumerator() + fractionAdd.getNumerator()), (fractionAddTwo.getDenominator() + fractionAdd.getDenominator()));
       return newFraction;
    }

    public static Fraction subtraction(Fraction fraction, Fraction fractionTwo){
       Fraction commonDenominator = commonDenominator(fraction, fractionTwo);
       Fraction fractionAdd = multiply(fraction, commonDenominator);
       Fraction fractionAddTwo = multiply(fractionTwo, commonDenominator);
       Fraction newFraction = new Fraction((fractionAdd.getNumerator() - fractionAddTwo.getNumerator()), (fractionAdd.getDenominator() + fractionAddTwo.getDenominator()));
       return newFraction;
    }

    public static boolean equals(Fraction fraction){
       if(numerator == fraction.getNumerator() && denominator == fraction.getDenominator()){
          return true;
       }
       else{
          return false;
       }
    }

    public static double decimalValue(Fraction fraction){
       double decimal = (double)fraction.getNumerator()/fraction.getDenominator();
       return decimal;
    }  
    public static Fraction reduce(int numerator, int denominator){

       if(numerator==0&&denominator==0){
          numerator = 0;
          denominator = 0;
       }
       else{
          for(int x = Math.max(numerator, denominator); x>0; x--){
             if(denominator == numerator){
                numerator = 1;
                denominator = 1;
             }
             else if(numerator == 0){
                numerator = 0;
                denominator = 1;
             }
             else if(numerator%x==0 && denominator%x==0){
                numerator = numerator/x;
                denominator = denominator/x;    
             }
          }
       }
       Fraction fraction = new Fraction(numerator, denominator);
       return fraction;
    }


    public String toString(){
       reduce(numerator, denominator);
       return (numerator) + "/" + (denominator);
    }

 }

Upvotes: 0

Views: 662

Answers (3)

Sarah
Sarah

Reputation: 43

I figured out why it was squaring the last number instead of multiplying the two numbers. It was because my instance variables were static an they weren't supposed to be.

Upvotes: 0

Mateusz Korwel
Mateusz Korwel

Reputation: 1148

This method should be static, and then you call it Fraction.multiply(f1, f2)

public static Fraction multiply(Fraction fraction, Fraction fractionTwo) {
    Fraction newFraction = new Fraction(fraction.getNumerator() * fractionTwo.getNumerator(), fraction.getDenominator() * fractionTwo.getDenominator());
    return newFraction.reduce();
}

or method should use the current status of the object. Then you call it new Fraction(3,4).multiply(f1). This method can look like this:

public Fraction multiply(Fraction fractionTwo) {
    Fraction newFraction = new Fraction(numerator * fractionTwo.getNumerator(), denominator * fractionTwo.getDenominator());
    return newFraction.reduce();
}

So, all the code can look like this.

class Fraction {

    private int numerator;
    private int denominator;

    public Fraction(int num, int den) {
        numerator = num;
        denominator = den;
    }

    public static void main (String[] args){
        Fraction r1 = new Fraction (2,3); // 2/3
        Fraction r2 = new Fraction(3,4); // 3/4
        Fraction r3 = r1.multiply(r2); // 2/3 * 3/4
        System.out.println(r3); // print 1/2
    }

    public int getNumerator() {
        return numerator;
    }

    public int getDenominator() {
        return denominator;
    }

    public Fraction multiply(Fraction fractionTwo) {
        Fraction newFraction = new Fraction(numerator * fractionTwo.getNumerator(), denominator * fractionTwo.getDenominator());
        return newFraction.reduce();
    }

    public Fraction reduce() {
        for (int x = Math.max(numerator, denominator); x > 0; x--) {
            if (numerator % x == 0 && denominator % x == 0) {
                numerator = numerator / x;
                denominator = denominator / x;
            }
            if (denominator == numerator) {
                numerator = 1;
                denominator = 1;
            }

        }
        return this;
    }

    @Override
    public String toString() {
        return numerator + " / " + denominator;
    }
}

Upvotes: 1

D3myon
D3myon

Reputation: 181

I won't give the same answer as you already got. So I answer regarding the toString() method.

Please keep in mind that any object inherits from the class object. And if you use the method toString() you override it from the object class.

Here you can see the methods inside the object class: http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/Object.html

As you can see, the toString() method represents the object where it is used and it requires no parameter. So if you implement it as follows:

public String toString() {
    return **your Code**;
}

Then this one should give no weird numbers and letters (which are actually the current memory address of the object).

All the best

Upvotes: 0

Related Questions