• Post Reply Bookmark Topic Watch Topic
  • New Topic
programming forums Java Mobile Certification Databases Caching Books Engineering Micro Controllers OS Languages Paradigms IDEs Build Tools Frameworks Application Servers Open Source This Site Careers Other Pie Elite all forums
this forum made possible by our volunteer staff, including ...
Marshals:
  • Campbell Ritchie
  • Tim Cooke
  • Ron McLeod
  • Jeanne Boyarsky
  • Paul Clapham
Sheriffs:
  • Liutauras Vilda
  • Henry Wong
  • Devaka Cooray
Saloon Keepers:
  • Tim Moores
  • Stephan van Hulst
  • Tim Holloway
  • Al Hobbs
  • Carey Brown
Bartenders:
  • Piet Souris
  • Mikalai Zaikin
  • Himai Minh

Calculating download time

 
Greenhorn
Posts: 4
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Hi. I new to Java and learning on my own from a book. One of the exercises is to calculate the download time of a 50MB file. I have figured out the hours and minutes but my seconds are off. Here is the code:

import java.util.Scanner;
import java.math.BigDecimal;

public class DownloadTime
{
public static void main( String parameters[] )
{
final double KB_PER_SEC = 5.2;

double hours = 0;
double minutes = 0;
double seconds = 0;
double megabytes = 0;
double kilobytes = 0;
double totalSeconds = 0;
Scanner sc = new Scanner( System.in );
String choice = "n";

do
{
System.out.print( "\n\nEnter the size of the file in megabytes(MB): " );
megabytes = sc.nextDouble();

// Convert megabytes to kilobytes because the value to divide must be in seconds. The division of
// kb and KB_PER_SEC will cancel out the kilobytes and leave only seconds, which is what we want.
kilobytes = megabytes * 1024;
totalSeconds = kilobytes / KB_PER_SEC;

// There are 3600 seconds in one hour so divide the total
// number of seconds by 3600 to get the number of hours.
hours = totalSeconds / 3600;

// The minutes are the remainder that's left after getting the hours. Since
// there are 60 seconds in one minute divide that remainder by 60.
minutes = ( totalSeconds % 3600 ) / 60;

// The seconds are what's left over after getting the hours and minutes.
seconds = ( totalSeconds % 3600 ) - ( minutes * 60 );

//// Convert megabytes to kilobytes because the value to divide must be in seconds. The division of
//// kb and KB_PER_SEC will cancel out the kilobytes and leave only seconds, which is what we want.
//kilobytes = megabytes * 1024;
//BigDecimal bdKilobytes = new BigDecimal( Double.toHexString( kilobytes ) );
//bdKilobytes = bdKilobytes.
//totalSeconds = kilobytes / KB_PER_SEC;
//
//// There are 3600 seconds in one hour so divide the total
//// number of seconds by 3600 to get the number of hours.
//hours = totalSeconds / 3600;
//BigDecimal bdHours = new BigDecimal( Double.toString( hours ) );
//
//// The minutes are the remainder that's left after getting the hours. Since
//// there are 60 seconds in one minute divide that remainder by 60.
//minutes = ( totalSeconds % 3600 ) / 60;
//BigDecimal bdMinutes = new BigDecimal( Double.toString( minutes ) );
//
//// The seconds are what's left over after getting the hours and minutes.
//seconds = ( totalSeconds % 3600 ) - ( minutes * 60 );
//BigDecimal bdSeconds = new BigDecimal( Double.toString( seconds ) );

// System.out.println( "\nA 56K modem will take " + bdHours + " hours, " + bdMinutes + " minutes, and " + bdSeconds + " seconds." );
// System.out.print( "\nContinue?(y/n): " );
// choice = sc.next();

System.out.println( "\nA 56K modem will take " + hours + " hours, " + minutes + " minutes, and " + seconds + " seconds." );
System.out.print( "\nContinue?(y/n): " );
choice = sc.next();

}
while ( choice.equalsIgnoreCase( "y" ) );
}
}

I think that I am loosing something when I do the division for totalSeconds. I should point out that when I used a an int value such as 4206 seconds instead of doing a calculation I get the correct answer(1 hour, 10 mins 6 secs)

KP>
 
K Parsons
Greenhorn
Posts: 4
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
I forgot to add that in the book it shows the result for a 50MB file as 2 hours 44 minutes and 6 seconds. I got the 2 and 44 but I'm getting 0 seconds.

KP>
 
Marshal
Posts: 76059
362
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
You have correctly calculated the minutes with % 3600. Have you tried the same sort of thing for seconds?
 
K Parsons
Greenhorn
Posts: 4
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
The formula I have works. If I use the example of 4206 seconds instead of reading a value in and doing a division it works out the following way:

(1) There are 3600 seconds in one hour so divide by 3600.

4206 / 3600 = 1 ->This is the number of hours

4206 % 3600 = 606 -> This is the remainder from the division


(2) There are 60 seconds in one minute so divide 606 by 60 to get the minutes

606 / 60 = 10 -> This is the number of minutes

606 % 60 = 6 -> This remainder is the number of seconds.


(3) To get the number of seconds I used the following formula:

(4206 % 3600) - (60 * 10)

(totalNumberOfSeconds % secondsPerHour) - (secondsPerMinute * minutes)

KP>
 
K Parsons
Greenhorn
Posts: 4
  • Mark post as helpful
  • send pies
    Number of slices to send:
    Optional 'thank-you' note:
  • Quote
  • Report post to moderator
Problem Solved! The solution is to cast the result of division to a long. You can also use the Math.round method.

KP>
 
With a little knowledge, a cast iron skillet is non-stick and lasts a lifetime.
reply
    Bookmark Topic Watch Topic
  • New Topic