mxgenius
mxgenius

Reputation: 65

Why wont my array average all numbers?

i have to create an array and a method call for the average. but for some reason it is not average all numbers, its only returning the last number. I have asked my instructor for help and she said the math is correct it should work. But no other help from her. What have I done wrong?

public static void main(String[] args) {
    double[] myArray = new double[2];

    initialize(myArray);
    double avg = getAverage(myArray);
    System.out.println(avg);
    output(avg);
}

public static void initialize(double[] myArray) {
    //myArray = new double[1000];
    for(int i = 0; i < myArray.length; i++) {
        myArray[i] = (int) ((Math.random()*500)*1);
        System.out.println(myArray[i]);
    }
}

/**
 *
 * @param myArray
 * @return
 */
public static double getAverage(double[] myArray) {
    int sum = 0;
    for (int i = 0; i < myArray.length; i++) {
        sum += myArray[i];
    }
    return sum / myArray.length;
}

public static void output(double avg) {
    System.out.println("The average is " + avg);
}

Upvotes: 1

Views: 71

Answers (2)

Sudipta
Sudipta

Reputation: 1

What is the problem here? The answers are coming correctly. Please check again. The interesting fact is that the third number is always same as the average of all three. But the average computation is correct. That may be how Math.random() generates random numbers internally. The third is the average of the other two. Try out four or five numbers instead of three numbers and check your answers.

Upvotes: 0

Michael Berry
Michael Berry

Reputation: 72294

The key is in this line:

sum / myArray.length

...since both sum and myArray.length are integers, Java performs integer division, not floating point division, which essentially means it drops the decimal component of the result.

Casting one of the values to a double first will force a floating point division to occur.

You're also storing the sum as an int, which could again introduce a source of error since the array contains doubles. In this case you're ok because you're casting everything you put into the array to an int first, which begs the question as to why you're using a double array in the first place?

As an aside, this is a bit odd:

((Math.random()*500)*1);

There's no need to multiply the result by 1 here - that won't do anything.

Upvotes: 3

Related Questions