• 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

    • Windoze 11 delivering whatever drivers to me in a recent laptop (2024) made me disable the ability to receive drivers altoghether. I was repeatedly losing the ability to have a lighted keyboard, because I'd install the most recent driver from the manufacturer, and Windoze would immediately "replace it" or "complement it" with a whatever "Component download" of its own. Wasted me a couple of days troubleshooting that crap. Windoze 11 wasting my time since like forever.
    • Apple iOS 26 beta has a hidden iPhone ringtone by Aditya Tiwari If you're waiting for a new iPhone ringtone to attend your calls, Apple might be baking something for this year. The recently announced iOS 26 update hides a new ringtone for iPhone, discovered in the source code of its first developer beta. Details about the new iPhone ringtone called "ReflectionAlt1-EncoreRemix" were posted on the social media platform X by @8810cfw. It was later re-shared by known Apple leaker @ShrimpApplePro and confirmed by @aaronp613. Looking back a few pages in tech history, Apple's ringtone journey began with the first iPhone in 2007. The Cupertino giant included the classic Marimba ringtone as default, which became a signature for Apple fans. Since then, Apple has continued to release new ringtones and system sounds over the years. However, it exerted more control over iPhone ringtones during the initial years. In addition to the ringtones preloaded on iPhones, Apple also allows users to buy new ringtones from the iTunes Store app. Users can also create their own custom ringtones from an audio file or a song from Apple Music using the GarageBand app. Not just Apple, tech companies have long used ringtones as a way to differentiate their devices from the rest. This includes the fallen warrior, Nokia, and newer competitors like the Google Pixel, which got a new Sound Matters collection last year. The unreleased iPhone ringtone isn't directly available to users in the Settings app as part of the developer beta. It's an alternative version of the Reflection ringtone that has been present on iPhones as the default since 2017. While it's being speculated that the ringtone could be exclusive to this year's iPhone 17 series, it's unclear if Apple will include it in upcoming iOS 26 beta releases. Apple will release the iOS 26 update later this year, featuring a range of new features, including a revamped Photos app, new iPhone wallpapers, and the Vista-like Liquid Glass design. Its public beta is expected to arrive sometime during the next month.
    • This article is about the start menu not the start button
    • This is why I wasn't really annoyed with Windows 8's full screen Start. Since Vista I launch programs by quickly pressing the WIN key and typing first few letters of whatever it is I need. Honestly, my personal equivalent of the Start menu is the WIN+X menu - it truly contains some useful things I do not feel like typing into Search.
  • Recent Achievements

    • One Month Later
      KynanSEIT earned a badge
      One Month Later
    • One Month Later
      gowtham07 earned a badge
      One Month Later
    • Collaborator
      lethalman went up a rank
      Collaborator
    • Week One Done
      Wayne Robinson earned a badge
      Week One Done
    • One Month Later
      Karan Khanna earned a badge
      One Month Later
  • Popular Contributors

    1. 1
      +primortal
      681
    2. 2
      ATLien_0
      274
    3. 3
      Michael Scrip
      220
    4. 4
      +FloatingFatMan
      171
    5. 5
      Steven P.
      160
  • Tell a friend

    Love Neowin? Tell a friend!