Link to home
Start Free TrialLog in
Avatar of timothy1
timothy1

asked on

Rounding numbers to two decimals

In the following Script; how do I get the total to round to two decimal places i.e. $21.36?

<html>
<head>
<script language="JavaScript">
var N=3 // number of VAL/QTY  pairs

function calcit()
      {
      stotal = 0;
      f = document.forms[0];
      for(i=0 ; i<N ; i++)
            {
            if (f.elements[i*2].value >= 0)
                  {
                  v = f.elements[i*2].value;
                  q = f.elements[i*2+1].value;
                  t1 = v * q;
                  }
                  stotal += t1;
                  }
                  f.stotal.value = "$" + stotal;

      //10%tax
      total = stotal * 1.0775;
      f.total.value = "$" + total;
}
</script>
</HEAD>

<BODY>
<FORM>
VAL1:<INPUT TYPE="text" name="v1" value="" size=6><br>
QTY:<INPUT TYPE="text" name="q1" value="1" size=3><br>

VAL2:<INPUT TYPE="text" name="v2" value="" size=6><br>
QTY:<INPUT TYPE="text" name="q2" value="1" size=3><br>

VAL3:<INPUT TYPE="text" name="v3" value="" size=6><br>
QTY:<INPUT TYPE="text" name="q2" value="1" size=3><br>

STOTAL:<input name="stotal" type='text'>
TOTAL:<input name="total" type='text'>
<input type="submit" value="calculate" onClick="calcit();return false;">
</FORM>
</BODY>
</html>
ASKER CERTIFIED SOLUTION
Avatar of Michel Plungjan
Michel Plungjan
Flag of Denmark image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
So in your case it would be

f.total.value = "$" + roundOff(total, 2);
f.stotal.value = "$" + roundOff(stotal, 2);

Michel
Avatar of kollegov
kollegov

mplungjan, Do you EVER check your posts?
Try to roundOff(0.11,2) with script you suggested
you will get 11 instead of 0.11

timothy1, this is bugs free solution. (TESTED)
Hope this one is better than above buggy solution
from developer.netscape.com

function roundOff(total,prec)
{total=""+Math.round(total*Math.pow(10,prec));
 inx=total.indexOf(".")
 if(inx!=-1) total=total.substring(0,inx);
 while(total.length<prec) total="0"+total;
 alert(total)
 total=total.substring(0,total.length-prec)+"."+total.substring(total.length-prec);
 return total;
}

Hey, hey, kollegov - that comment was uncalled for...
I check 99.9% of my answers.

In this case I cut and pasted a script from netscape and I really expected to work without even thinking it might be wrong. I am at home on a crap pc so I skipped testing for once.

Timothy: I am sorry if the script did not work. Feel free to reject my answer and if kolloegovs script works better, let him answer instead. I would normally give you one of my (tested) scripts, but they are not on my home pc. I apologise.

Michel
Avatar of timothy1

ASKER

Well guys don't fight! I put the first one in my Html (after taking out just the script) and sent the roundoff() function various prices. It worked fine. The object was to use it in an order form, so the user wouldn't get the math wrong when figuring the sales tax (or sub-totals). I doubt if the customer will have prices that after taxes will end up with 0.11 it works fine with 20.101 and the like.

I will try the other one also, but I think the first will fit the need I haven't taken Java yet only "C", but as you know they seem to be similiar in syntax and grammer.

Interestingly enough, you mentioned this came from Netscape?
I ran it through IE4 and it worked fine.

You don't happen to know of a online reference or tutorial that list all those math.round(), math.pow(), parseInt(), etc. functions that I see in the code and tells what they are for?
I can guess at most, but a list would be cool!

I'll check out that URl,,,,developer.netscape.com

Again Thanks,
Tim
Thanks. Netscape and Microsofts core javascript works 99.99999999997 % the same ;-).

http://developer.netscape.com/ also has the javascript reference
It seems the site is down for maintenance so I cannot give you the exact URL of the math stuff.
Javascript syntax looks a lot like java especially in the math package.
Math.round rounds down to the nearest integer
Math.pow(x,y) will compute x to the power of y - may cause overflow for large values of y
for IEs look at http://msdn.microsoft.com/scripting/