Solved

Round parseFloat number value to two deciml points

Posted on 2003-12-08
19
11,523 Views
Last Modified: 2012-06-21
I have a function that does some math, and am using parseFloat.  The value it returns must be rounded to two decimal places.  I have tried Math.Round(value) but it returns nothing.  Is this because math.round does not work with parseFloat?  The script uses two fields, and is as follows:

function totalFields()
{
myTotal1 = document.myForm.before.value;
myTotal2 = document.myForm.after.value;
myBigTotal = [(parseFloat(myTotal1)-parseFloat(myTotal2))*100]/parseFloat(myTotal1);
return(myBigTotal)
}
function addemup()
{
document.myForm.grandtotal.value=totalFields();
}

How can I convert the value to something recognized by math.round(value), or is there another way of converting this to two decimal points?  A test value could be 12.55658334973432

Thanks in advance,

lance22
JavaScript Noob
0
Comment
Question by:lance22
19 Comments
 
LVL 31

Expert Comment

by:GwynforWeb
ID: 9900663
<script>
num='234.123453'
str=new String()
str=num
str=str.match(/^\d*\.\d{2}/)
alert(str)
</script>

0
 
LVL 31

Expert Comment

by:GwynforWeb
ID: 9900676
or

<script>
function convert(str){
str=str.match(/^\d*\.\d{2}/)
return str
}
</script>

<<form>
  <p><input type="text" name="t1">
<input type="button" value="convert" onclick="t1.value=convert(t1.value)"> </p>
</form>
0
 
LVL 31

Expert Comment

by:GwynforWeb
ID: 9900699
for your function do this

function totalFields()
{
myTotal1 = document.myForm.before.value;
myTotal2 = document.myForm.after.value;
myBigTotal = [(parseFloat(myTotal1)-parseFloat(myTotal2))*100]/parseFloat(myTotal1);

myBigTotal=myBigTotal+' '
myBigTotal=myBigTotal.match(/^\d*\.\d{2}/)
return(myBigTotal)
}
function addemup()
{
document.myForm.grandtotal.value=totalFields();
}
0
Gigs: Get Your Project Delivered by an Expert

Select from freelancers specializing in everything from database administration to programming, who have proven themselves as experts in their field. Hire the best, collaborate easily, pay securely and get projects done right.

 
LVL 25

Expert Comment

by:devic
ID: 9900819
hi lance22,

try this:
=======================
function totalFields()
{
      myTotal1 = document.myForm.before.value*1;
      myTotal2 = document.myForm.after.value*1;
      return Math.round(((myTotal1-myTotal2)*100)/myTotal1);
}
0
 
LVL 31

Accepted Solution

by:
GwynforWeb earned 250 total points
ID: 9900822
oops that truncates

<script>
function convert(str){
str=str.match(/^\d*\.\d{3}/)*100
str=Math.round(str)/100
return str
}
</script>

<form>
  <p><input type="text" name="t1">
<input type="button" value="convert" onclick="t1.value=convert(t1.value)"> </p>
</form>

so your function is

function totalFields()
{
myTotal1 = document.myForm.before.value;
myTotal2 = document.myForm.after.value;
myBigTotal = [(parseFloat(myTotal1)-parseFloat(myTotal2))*100]/parseFloat(myTotal1);

myBigTotal=myBigTotal+' '
myBigTotal=myBigTotal.match(/^\d*\.\d{3}/)*100
myBigTotal=Math.round(myBigTotal)/100
return(myBigTotal)
}


0
 
LVL 31

Expert Comment

by:GwynforWeb
ID: 9900868
After all that I think this is probably the most natural no ned for parseFloat, multiplying  a string variable returns a number so you can rearrange the expression to return the correct number

function totalFields()
{
myTotal1 = document.myForm.before.value;
myTotal2 = document.myForm.after.value;
myBigTotal = (myTotal1*100-myTotal2*100)/myTotal1;
myBigTotal=Math.round(100*myBigTotal)/100
return(myBigTotal)
}
0
 
LVL 1

Expert Comment

by:Jagata
ID: 9901563
Nice and simple, just use this in place of Math.round;

            function roundFloat(fltValue) {
               return Math.round(fltValue * 100) / 100;
            }

As per your example;

fltValue = 12.55658334973432
12.55658334973432 * 100 = 1255.658334973432
Math.round(1255.658334973432) = 1255
1255 / 100 = 12.55

So the function would output 12.55.
0
 
LVL 31

Expert Comment

by:GwynforWeb
ID: 9901586
Thats what I just said
0
 
LVL 1

Expert Comment

by:Jagata
ID: 9901620
I was just providing an OO solution. A concept sadly lost on many people.
0
 
LVL 31

Expert Comment

by:GwynforWeb
ID: 9901768
OO can not be implemeneted blindly without attention to the specifics of the problem. There are a number of type converison problems here
0
 
LVL 1

Expert Comment

by:Jagata
ID: 9901779
>> OO can not be implemeneted blindly without attention to the specifics of the problem.

I hardly think this is a blind implementation.

>> There are a number of type converison problems here

Including the error in your solution?
0
 
LVL 31

Expert Comment

by:GwynforWeb
ID: 9901838
What error?

ps

Math.round(1255.658334973432) = 1256  not 1255

so the output would be

1256 / 100 = 12.56
0
 
LVL 16

Expert Comment

by:jaysolomon
ID: 9901901
Quite the flaming down please

You are hurting my ears
0
 
LVL 31

Expert Comment

by:GwynforWeb
ID: 9901912
I agree.  Just in case my proposed solution does not get lost in the above I suggest changing totalFields() to

function totalFields()
{
myTotal1 = document.myForm.before.value;
myTotal2 = document.myForm.after.value;
myBigTotal = (myTotal1*100-myTotal2*100)/myTotal1;
myBigTotal=Math.round(100*myBigTotal)/100
return(myBigTotal)
}
0
 
LVL 1

Expert Comment

by:Jagata
ID: 9901965
ps

Math.round(1255.658334973432) = 1256  not 1255

so the output would be

1256 / 100 = 12.56

-- Ah thanks dude, damn hope my code doesn't do that. :)
0
 
LVL 1

Expert Comment

by:Jagata
ID: 9902001
Heres another nice little example in the spirit of OO design;

            function roundFloat(fltValue, intDecimal) {
               return Math.round(fltValue * Math.pow(10, intDecimal)) / Math.pow(10, intDecimal)
            }

Not quite as simple as the other examples but this one lets you round to any number of decimal places. :) Just specify the number to be rounded (fltValue) and the number of decimal places (intDecimal).
0
 
LVL 12

Expert Comment

by:ahosang
ID: 9903489
lance22,
Not trying to clutter the thread, but after taking advice from the above comments which are needed for compatibility with older browsers, you can also make note of a built-in function that works on newer browsers:
var myNumber=1.222367;//example
alert(myNumber.toFixed(2));

the toFixed function is in Javascript 1.5
0
 

Author Comment

by:lance22
ID: 9905407
I appreciate everyone's help very much.  My wife had suggested .toFixed but this stuff will be used by people with OLD computers.  Thank you.
0
 

Expert Comment

by:kajalg
ID: 10208380
the solution of regular expression doesn't work for decimal ranging between 0 and 1
0

Featured Post

Courses: Start Training Online With Pros, Today

Brush up on the basics or master the advanced techniques required to earn essential industry certifications, with Courses. Enroll in a course and start learning today. Training topics range from Android App Dev to the Xen Virtualization Platform.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

The task A number given should be formatted for easy reading by separating digits into triads. Format must be made inline via JavaScript, i.e., frameworks / functions are not welcome. So let’s take a number like this “12345678.91¿ and format i…
This article will give core knowledge of JavaScript and will head in to your first JavaScript program. I am Durvesh Naik and I am here to deal with this series of JavaScript. I will teach you JavaScript in part wise , as its quite boring to read big…
The viewer will learn the basics of jQuery, including how to invoke it on a web page. Reference your jQuery libraries: (CODE) Include your new external js/jQuery file: (CODE) Write your first lines of code to setup your site for jQuery.: (CODE)
The viewer will learn the basics of jQuery including how to code hide show and toggles. Reference your jQuery libraries: (CODE) Include your new external js/jQuery file: (CODE) Write your first lines of code to setup your site for jQuery…

785 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question