View Full Version : Math.round question

12-05-2012, 08:14 AM
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):

days = calculateDayCount(pickupDate, dropoffDate);

root_days = Math.round(days);
days_count = root_days;
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..

Philip M
12-05-2012, 08:51 AM
In vanilla Javascript,

<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");


"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)

12-05-2012, 09:42 AM
And simply ?

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

12-05-2012, 09:45 AM
var d = parseInt(days)

The JavaScript function for getting the integer portion of a number is Math.floor() so that statement should read:

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.

12-05-2012, 01:15 PM
@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)

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.

12-05-2012, 01:24 PM
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


days+11/12 = 2.9466667
Math.floor(days+11/12) = 2 (correct)

days+11/12 = 3,0006667
Math.floor(days+11/12) = 3 (correct, because .084 days is more than 2 hours)

Philip M
12-05-2012, 01:27 PM
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.

12-05-2012, 03:31 PM
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.. :)