• 0

[Java] Subtraction error when using double = double - int


Question

I'm having an error in the line of code below:

double difmeanmedian = mean - median;

Where double mean and int median are defined previously in the program without any troubles.

I'm getting weird results when running my program in the compiler. In the examples (ie, NOT CODE :) ) below of my results, variable(number) will mean that I used said variable that had a value of said number.

double difmeanmedian = mean(7.0) - median(8); //returns difmeanmedian = 5.0 (incorrect)
double difmeanmedian = mean(13.0) - 1; //returns difmeanmedian = 12.0 (correct)
double difmeanmedian = 13.0 - 1; //returns difmeanmedian = 12.0 (correct)
double difmeanmedian = 25.0 - median(14); //returns difmeanmedian = 23.0 (incorrect)

Any idea what might be causing this? Any help would be greatly appreciated! :D

Full code in case you want more:

(*Note: is there a way to hide this long snippet? Perhaps a "spoiler" button?)

import java.util.Random;
import java.util.Scanner;

public class Vesuvius {
    public static void main(String [] args){
        Scanner input = new Scanner(System.in);

    //User defines parameters
        System.out.println("Definet of integers from x to y inclusive from which random integers shall be generated, and define how many integers shall be generated.");
        System.out.println("Define);
        int x = input.nextInt();
        System.out.println("Define);
        int y = input.nextInt();
        System.out.println("How integers should be generated?");
        int intsgenerated = input.nextInt();

  //Generates an array "set" of random numbers based on the user's specifications.
        int temp1;
        int[] set = new int[intsgenerated];
        Random generator = new Random();
        for(int i=0; i<intsgenerated; i++){
            temp1 = generator.nextInt(y-x)+x;
            set[i] = temp1;
        }

   //Selection sort to sort the random numbers of array set in ascending order
        for(int i=0; i<set.length-1; i++){      
            for(int j=i+1; j<set.length; j++){
                if(set[i] > set[j]){
                    int temp = set[i];
                    set[i] = set[j];
                    set[j] = temp;
                }
            }
        }

    //Calculates the mean of the set
        double mean;
        int temp2 = 0;
        for(int i=0; i<set.length; i++){
            temp2 = temp2 + set[i];
        }
        mean = temp2/set.length;
        System.out.println("The is " + mean);

    //Finds maximum value of the set
        int max = 0;
        for(int i=0; i<set.length; i++){                  //Finds and prints maximum value.
          if(set[i] > max){
            max = set[i];
          }
        }

    //Calculates the median of the set
        int median;
        median = set.length/2;
        System.out.println("Thean is " + set[median]);

    //Calculates the mode with the highest value. ie, if both 5 and 9 are modes of the set, only 9 will be returned.
        int mode = 0;
        int[] tally = new int[max+1];
        int q = 0;
        for(int i=0; i<tally.length; i++){               
          tally[i] = 0;                         
        }for(int i=0; i<set.length; i++){
          q = set[i];
          tally[q]++;
        }for(int i=0; i<tally.length; i++){
          if(tally[i] >= tally[mode]){
            mode = i;
          }}
        if(tally[mode] == 1){
            System.out.println("Thereo mode in this set.");
        }else{
        System.out.println("The of the set is " + mode + ".");
        }

double difmeanmedian = mean - median;  //this line doesn't behave well
int difmedianmode = median - mode;
double difmeanmode = mean - mode;  //nor does this line

System.out.println("difmeanmedian difmeanmedian);
System.out.println("difmedianmode difmedianmode);
System.out.println("difmeanmode difmeanmode);

//----------------------------------------------------------------------------//
//Prints list of numbers
       System.out.println("The of numbers generated is: ");
        for(int i=0; i<intsgenerated; i++){
            System.out.print(set[i] + ", ");
       }

    }
}

5 answers to this question

Recommended Posts

  • 0

//Calculates the median of the set
        int median;
        median = set.length/2;
        System.out.println("Thean is " + set[median]);

It looks like you are using the index of the median, rather than the value of the median. In the example you posted the median is two, in both cases which is why the value returned was not what you expected, which I am assuming is the index. I think you want:

median = set[set.length/2];

  • 0
  On 21/03/2010 at 13:57, Minchino said:

//Calculates the median of the set
        int median;
        median = set.length/2;
        System.out.println("Thean is " + set[median]);

It looks like you are using the index of the median, rather than the value of the median. In the example you posted the median is two, in both cases which is why the value returned was not what you expected, which I am assuming is the index. I think you want:

median = set[set.length/2];

Yes, thank you, that would definitely be my problem! :D

What package do I need to import to use the set.get() method? Does it expect an int as a parameter?

  • 0

Thanks, that fixed that problem!

I've got another problem though... the double mean is always coming out as an integer (not to be confused with an int). For example, when I have set with values {1, 1, 1, 3, 3, 4}, the mean SHOULD be 13/6 = 2.166667, but it returns 2.0. Is this because the decimal is repeating, or have I done something wrong? If it is because of the repeating problem, how can I fix it?

  • 0

int temp2 = 0;
for(int i=0; i<set.length; i++){
     temp2 = temp2 + set[i];
}
mean = temp2/set.length;

Because temp2 and set.length are integers, integer division is performed (any remainder is lost). To avoid this cast one of the arguments to a double:

mean = ((double) temp2)/set.length;

This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.