Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Issue with storing percentages in a long

Tags:

java

I am trying to write a program for class that reads a list of hours worked annually from a .txt file, assigns/reads (A little fuzzy on the proper terminology :)) them into an array, and then calculates overages and prints them.

When I run, console output is as follows:

Employee 1 worked 1600 hours, an under-run of 160 or 0%
Employee 3 worked 1680 hours, an under-run of 80 or 0%

Why are the percentages zero?

import java.io.*;
import javax.swing.*;

class Calculator 
{
 public static void main(String args[])
  {

  try{

      String filePathString=JOptionPane.showInputDialog(null,"What is the file path?");  

      FileInputStream fstream = new FileInputStream("C:\\hello.txt");
      BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
      String strLine;
      int counter = 0;
      long[] Array = new long[5];   


      //Read File Line By Line
      while (counter <= 4)

        {
            strLine = br.readLine();
            Array[counter] = Long.parseLong(strLine); 
            OverageUnderage(Array[counter], counter);
            counter = counter + 1;
        }

  //Close the input stream
  in.close();

    }

  catch (Exception e){//Catch exception if any
  System.err.println("Error: " + e.getMessage());
  }
  }

 public static long OverageUnderage(long hours, long counter)
 {
 long overageAmount = 0;
 long overagePercent = 0;

     if (hours < 1760)
     {    
        overageAmount = 1760 - hours;
        overagePercent = ((overageAmount/1760)*100);

        System.out.println("Employee "+counter+" worked "+hours+" hours, an under-run of "+overageAmount+" or "+overagePercent+"%");
    }

    return counter;
 }

}
like image 224
user1080519 Avatar asked Jan 26 '26 01:01

user1080519


2 Answers

The number ( overageAmount / 1760 ) is being treated as a long, not a double, which you'll need. Try:

overagePercent = ( ( overageAmount / 1760.0 ) * 100 );

using the .0 on 1760 will have it treated as a decmial value. This will prevent the rounding to 0 issue you were seeing, and allow the calculation to have decimals for the rest of the calculations, providing you with your desired result.

like image 140
Adam Wenger Avatar answered Jan 29 '26 07:01

Adam Wenger


That's why (IMHO) you divide long instead of doubles:

overagePercent = ((overageAmount / 1760)*100);

Here overageAmount/1760 returns 0!
So you have two solutions:

  1. First convert overageAmount to double and then execute the operation
  2. Divide with float 1760.0 so resulting number is already a float
like image 27
Marco Avatar answered Jan 29 '26 07:01

Marco



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!