Hello and welcome to our community! Is this your first visit?
Register
Enjoy an ad free experience by logging in. Not a member yet? Register.
Results 1 to 8 of 8
  1. #1
    New to the CF scene
    Join Date
    Dec 2012
    Posts
    6
    Thanks
    4
    Thanked 0 Times in 0 Posts

    Math.round question

    Hello guys,

    A newbie here and newbie in javascript. I'm just learning and really can't do much but read the code, understand and do some changes. Will much appreciate your help here.

    So the problem I have is with rounding. Here is the little code I have (there is more and if requested I can post it here, but my question is more general):
    Code:
    days = calculateDayCount(pickupDate, dropoffDate);
    	
    	getPrices(days);
    	root_days = Math.round(days);
    	days_count = root_days;
    	$j('#day_count').val(days_count);
    	$j('#header_days').html(days_count);
    	return ["ok", 0, 0];
    days are actually calculated as dropoffDate-pickupDate and I'm getting results like 1.25, 2.89, 3.11 etc etc..

    So what the Math.round(days) does, is it rounds as usual and stores in root_days, but the problem is that I need it rounded not as usual. Here is why:
    The code will work for a service calculation and if service is provided for more then 2 hours, the service charges for the whole day. Example

    1 day 1.5 hours - we'll charge for 1 day
    1 day 2.5 hours - we'll charge for 2 days
    2 day 0.5 hours - we'll charge for 2 days
    2 days 5 hours we'll charge for 3 days
    etc etc..

    So the question is that how can i round appropriate way to calculate charges properly. I assume 1 hour is appox. 0.04 day.

    Thank you guys.. again if you think you need the full code i can post here with the first request.

    p.s. I'm thinking that i need to use math.floor here somehow, but can't really think how..

  • #2
    Supreme Master coder! Philip M's Avatar
    Join Date
    Jun 2002
    Location
    London, England
    Posts
    18,316
    Thanks
    203
    Thanked 2,565 Times in 2,543 Posts
    In vanilla Javascript,

    Code:
    <script type = "text/javascript">
    
    var days = 2.03;  // 2 hours = .0833333 days
    var d = parseInt(days)
    var fraction = days - d;
    if (fraction < .08333333) {
    days --;
    }
    d = Math.ceil(days);
    alert ("Charge is for " + d + " days");
    
    </script>
    "If you can't explain it simply, you don't understand it well enough”
    “Everything should be as simple as it is, but not simpler.”
    - both quotes Albert Einstein (German born American Physicist who developed the special and general theories of relativity. Nobel Prize for Physics in 1921. 1879-1955)

    All the code given in this post has been tested and is intended to address the question asked.
    Unless stated otherwise it is not just a demonstration.

  • #3
    Regular Coder
    Join Date
    May 2012
    Location
    France
    Posts
    224
    Thanks
    0
    Thanked 32 Times in 30 Posts
    And simply ?
    Code:
    var d = Math.floor(days+11/12);
    Last edited by 007julien; 12-05-2012 at 10:08 AM.

  • The Following 3 Users Say Thank You to 007julien For This Useful Post:

    devnull69 (12-05-2012), mh_and (12-05-2012), Philip M (12-05-2012)

  • #4
    Master Coder felgall's Avatar
    Join Date
    Sep 2005
    Location
    Sydney, Australia
    Posts
    6,642
    Thanks
    0
    Thanked 649 Times in 639 Posts
    Quote Originally Posted by Philip M View Post
    Code:
    var d = parseInt(days)
    The JavaScript function for getting the integer portion of a number is Math.floor() so that statement should read:

    Code:
    var d = Math.floor(days);
    parseInt is for converting numbers between bases - eg binary to decimal, hexadecimal to decimal or even base 36 to decimal.
    Stephen
    Learn Modern JavaScript - http://javascriptexample.net/
    Helping others to solve their computer problem at http://www.felgall.com/

    Don't forget to start your JavaScript code with "use strict"; which makes it easier to find errors in your code.

  • #5
    New to the CF scene
    Join Date
    Dec 2012
    Posts
    6
    Thanks
    4
    Thanked 0 Times in 0 Posts
    @007julien can you please explain what exactly this Math.floor(days+11/12) achieves I'm asking this because...

    @felgall & Philip M variables days_count and root_days are used elsewhere in the code also, so I thought i can do this (I know i can assign d to anyting after this, but still didn't want to confuse myself)

    Code:
    if (days%1<0.11) {root_days = Math.floor(days)} else{
    	root_days = Math.floor(days)+1;}
    	days_count = root_days;
    is the modulus good way of replacing parseInt here? It actually works this way, but when I put days%1<0.09 which is logical to me, it just doesn't work well, skips some hours actually.

    Oh and I noticed I can use Math.ceil in place of second math.floor.

  • #6
    Senior Coder
    Join Date
    Dec 2010
    Posts
    2,398
    Thanks
    12
    Thanked 570 Times in 563 Posts
    11/12 of a day is 22 hours, i.e. 2 hours less than a day. If you add 11/12 to your "days" variable and then cut off the decimals, you'll end up with the correct value

    Examples:
    Code:
    days=2.03
    days+11/12 = 2.9466667
    Math.floor(days+11/12) = 2 (correct)
    
    days=2.084
    days+11/12 = 3,0006667
    Math.floor(days+11/12) = 3 (correct, because .084 days is more than 2 hours)

  • Users who have thanked devnull69 for this post:

    mh_and (12-05-2012)

  • #7
    Supreme Master coder! Philip M's Avatar
    Join Date
    Jun 2002
    Location
    London, England
    Posts
    18,316
    Thanks
    203
    Thanked 2,565 Times in 2,543 Posts
    Quote Originally Posted by mh_and;1297413days;[/CODE

    is the modulus good way of replacing parseInt here? .
    No. You have been given two scripts - both work, but julien007's is slicker. Don't ask for help and then ignore it.

    var d = Math.floor(days+11/12);

    11/12 of a day is (24-2) = 22 hours, so if you add 11/12 to the value of days (say 2.09) you get 3.00666666. Math.floor then resolves to 3 (days).
    Likewise if days = 2.08 adding 11/12 gives 2.9966666, which resolves to 2 days.

    That is what you asked for.

    All the code given in this post has been tested and is intended to address the question asked.
    Unless stated otherwise it is not just a demonstration.

  • Users who have thanked Philip M for this post:

    mh_and (12-05-2012)

  • #8
    New to the CF scene
    Join Date
    Dec 2012
    Posts
    6
    Thanks
    4
    Thanked 0 Times in 0 Posts
    Don't ask for help and then ignore it.
    @Philip M Absolutely, I'm just trying to get things done and understand what I'm doing. Also trying to experiment as well..

    Now I see how beautifully simple is 007julien's code..

    Thank you all..


  •  

    Posting Permissions

    • You may not post new threads
    • You may not post replies
    • You may not post attachments
    • You may not edit your posts
    •