• 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("Define a set 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 x: ");
        int x = input.nextInt();
        System.out.println("Define y: ");
        int y = input.nextInt();
        System.out.println("How many 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 mean 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("The median 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("There is no mode in this set.");
        }else{
        System.out.println("The mode 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 list 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("The median 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

//Calculates the median of the set
        int median;
        median = set.length/2;
        System.out.println("The median 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

    • HomeBank 5.10.1 by Razvan Serea HomeBank is a free software (as in "free speech" and also as in "free beer") that will assist you to manage your personal accounting. It is designed to easy to use and be able to analyse your personal finance and budget in detail using powerful filtering tools and beautiful charts. If you are looking for a completely free and easy application to manage your personal accounting, budget, finance then HomeBank should be the software of choice. HomeBank also benefits of more than 19 years of user experience and feedback, and is translated by its users in around 56 languages. Highlights: Cross platform, supports GNU/Linux, Microsoft Windows, Mac OS X Import easily from Intuit Quicken, Microsoft Money or other software Import bank account statements (OFX, QIF, CSV, QFX) Duplicate transaction detection Automatic cheque numbering Various account types : Bank, Cash, Asset, Credit card, Liability Scheduled transaction Category split Internal transfer Month/Annual budget Dynamic powerful reports with charts Automatic category/payee assignment Vehicule cost HomeBank 5.10.1 changelog: change: the input field helper icon + fixed some spacing inconsistency change: transaction, added some missing input tooltips and reworked existing change: category, payee and tag window add input now have a tooltip and button change: split window, refactored the layout change: split window, add display of memo and date wish : #2106800 budget report option to exclude transfers from unbudgeted line bugfix: prevent deletion of non pending transaction when rejecting bugfix: transaction warning for no rate faultly showing in transfer bugfix: report missing space for filter tooltip icon bugfix: budget report missing filter tooltip bugfix: manage account closed icon was hidding budget icon bugfix: #2154771 view transcations requires hitting Escape or X twice to close dialog bugfix: #2154337 transfer to/from closed account with different currency don't show the amount bugfix: #2154234 scheduled transaction recurring pattern daily value limited to 100 bugfix: #2149897 view split for closed accounts bugfix: #2148561 global time chart do not shows current period by default bugfix: #2148456 the main screen Total Chart is no longer showing an overall total bugfix: #2147497 editing a transaction resets scroll position bugfix: #2147377 balance mixup with transaction same day sort by amount bugfix: #2147052 quarter are wrong when fiscal year is jan 1 bugfix: #2147048 all events for the month are late but today is only the 1st bugfix: #2144993 impossible to search for transactions by value for values >999,99 bugfix: #2144698 adding new Category/Payee/Tags requires hitting -Enter- bugfix: #2144419 QIF Account name detection fail on import bugfix: #2142349 can't delete account groups bugfix: #2139409 account maximum limit is not fully used (example credit card) bugfix: #2133783 transfers shouldn't add to dashboard top spending reports Download: HomeBank 5.10.1 | 20.5 MB (Open Source) Download: 3rd party packages (macOSX. Ubuntu...etc) View: HomeBank Website | Support | Features | Screenshot Get alerted to all of our Software updates on Twitter at @NeowinSoftware
    • Same, price was right for my Home, laptop, phone. Works great!
    • Brave and Firefox. I’ve been using them as my primary browsers for a while now, perfect combo
    • They want Ring 0 access. Should be a hard no. A middle ground needs to be found.
  • Recent Achievements

    • One Year In
      Primer1st earned a badge
      One Year In
    • Experienced
      JayZJay went up a rank
      Experienced
    • Reacting Well
      Sir_Timbit earned a badge
      Reacting Well
    • Week One Done
      rubentuben8 earned a badge
      Week One Done
    • Week One Done
      ARaclen earned a badge
      Week One Done
  • Popular Contributors

    1. 1
      +primortal
      524
    2. 2
      PsYcHoKiLLa
      232
    3. 3
      Edouard
      135
    4. 4
      ATLien_0
      88
    5. 5
      Steven P.
      83
  • Tell a friend

    Love Neowin? Tell a friend!