Enjoy an ad free experience by logging in. Not a member yet? Register.

Results 1 to 8 of 8
Thread: Math.round question

12052012, 08:14 AM #1
 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];
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..
12052012, 08:51 AM
#2
 Join Date
 Jun 2002
 Location
 London, England
 Posts
 18,362
 Thanks
 204
 Thanked 2,573 Times in 2,551 Posts
In vanilla Javascript,
"If you can't explain it simply, you don't understand it well enough”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>
“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. 18791955)
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.
12052012, 09:42 AM
#3
 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; 12052012 at 10:08 AM.
12052012, 09:45 AM
#4
 Join Date
 Sep 2005
 Location
 Sydney, Australia
 Posts
 6,721
 Thanks
 0
 Thanked 663 Times in 652 Posts
The JavaScript function for getting the integer portion of a number is Math.floor() so that statement should read:
parseInt is for converting numbers between bases  eg binary to decimal, hexadecimal to decimal or even base 36 to decimal.Code:var d = Math.floor(days);
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.
12052012, 01:15 PM
#5
 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)
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.Code:if (days%1<0.11) {root_days = Math.floor(days)} else{ root_days = Math.floor(days)+1;} days_count = root_days;
Oh and I noticed I can use Math.ceil in place of second math.floor.
12052012, 01:24 PM
#6
 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 (12052012)
12052012, 01:27 PM
#7
 Join Date
 Jun 2002
 Location
 London, England
 Posts
 18,362
 Thanks
 204
 Thanked 2,573 Times in 2,551 Posts
No. You have been given two scripts  both work, but julien007's is slicker. Don't ask for help and then ignore it.Originally Posted by mh_and;1297413days;[/CODE
var d = Math.floor(days+11/12);
11/12 of a day is (242) = 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 (12052012)
12052012, 03:31 PM
#8
 Join Date
 Dec 2012
 Posts
 6
 Thanks
 4
 Thanked 0 Times in 0 Posts
@Philip M Absolutely, I'm just trying to get things done and understand what I'm doing. Also trying to experiment as well..Don't ask for help and then ignore it.
Now I see how beautifully simple is 007julien's code..
Thank you all..