• 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.
  • Posts

    • Black Myth: Wukong hits Xbox this August, exactly a year after PlayStation launch by Pulasthi Ariyasinghe Developer Game Science delivered one of the biggest action games of all time last year, with Black Myth: Wukong going on to sell tens of millions in its launch month and winning a multitude of awards. However, the title skipped out on a platform it was originally announced to launch in: Xbox. Following a long string of reasons and delays, it seems the port is finally coming to the platform. Today, Game Science announced that the Xbox Series X|S version of Black Myth: Wukong now has a release date, with it landing on August 20, 2025. Pre-orders for the title will become available starting June 18. Interestingly, this Xbox release date is set exactly one year after the original release on PlayStation 5 and PC. Game Science originally stated that the delay was due to technical issues with Xbox consoles. However, Microsoft refuted that claim quickly and alluded that the delay was due to some sort of console exclusivity deal between Game Science and Sony. In today's announcement, Game Science once again says that the delay was due to its work on porting the game to Xbox and meeting its quality standards. "Bringing Black Myth: Wukong to Xbox Series X|S—and ensuring the experience met our internal quality standards—was no easy feat," said the studio today regarding the long delay on Xbox platforms. "Fortunately, we were able to complete this challenging task smoothly within the first year of the game's official release." "If you're an Xbox player who hasn't yet experienced the game on another platform, we're confident it will stand among the finest ARPGs available on Xbox," added Game Science. For those looking to jump into the game a little cheaper than usual, Game Science will be hosting Black Myth: Wukong's first-ever sale on June 18. The 20% off discount will be available across PC, PlayStation, and even the Microsoft Store for the Xbox Series X|S pre-order.
    • And where is "don't be evil"? Oh, yeah, they removed it, too.
    • YouTube isn't a monopoly, it's just the most popular video platform, but other options and competitors do exist. And I'm not defending YouTube here, I'm a subscriber to Geerling's channel and I like his content and YouTube clearly went too far with this, but they can't be considered a monopoly, IMO. https://www.captions.ai/blog-post/youtube-alternatives
    • Harmful to them because it affects their business. *Sigh*
  • Recent Achievements

    • Week One Done
      theevergreentree earned a badge
      Week One Done
    • Dedicated
      Fryer Tuck earned a badge
      Dedicated
    • Week One Done
      luxoxfurniture earned a badge
      Week One Done
    • First Post
      Uranus_enjoyer earned a badge
      First Post
    • Week One Done
      Uranus_enjoyer earned a badge
      Week One Done
  • Popular Contributors

    1. 1
      +primortal
      439
    2. 2
      +FloatingFatMan
      247
    3. 3
      snowy owl
      227
    4. 4
      ATLien_0
      212
    5. 5
      Xenon
      152
  • Tell a friend

    Love Neowin? Tell a friend!