# Javascript subtraction help needed

I can't see to figure this one out... yet it seems so simple

when I calculate the following equation I am getting a very out results  5.21-5 = .2099999999999999998.

I need it to compute the actual value which is .2100000

function ComputeChange5(Start, Change, End) {
document.MainForm[Change].value = formatNum(eval(5.21-5),"^#,###.5^");
}

I am looking for a very simple solution... I apss into the function the start and end values, and then look for the change value (which is the subtraction). I tried to simplify the code above after I narrowed down that its not my passed in variables, its simply the calucation. thx.
###### Who is Participating?
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

Commented:
The problem is caused by round off error in the Javascript. You might want to try something like:

var number = 5.21 - 5;
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Systems architectCommented:
The fractal number is the nature of digital computer number representation.
That effect is stumping already others, but what do you want to ahieve?
Do you need help for that formatNum() function?
Do you know the method toFixed(2)
Like this:

0
Commented:
The toFixed() function will round your number to the number of decimal places that you want. I am not too sure why you need to use eval() either.
0
Author Commented:
this is my full function

function ComputeChange5(Start, Change, End) {
var vartotal = 0;
var varname = "";
var FieldName = End;

if (document.MainForm[FieldName].value.replace(/\,/g,"") == ''|| isNaN(document.MainForm[FieldName].value.replace(/\,/g,""))){
document.MainForm[FieldName].value = formatNum(eval(document.MainForm.oldvarstorage.value.replace(/\,/g,"")),"^#,###.5^");
alert('You entered an invalid number')
document.MainForm[FieldName].focus();}
else
{
if (document.MainForm[End].value == document.MainForm.oldvarstorage.value)
{}
else
{
vartotal = numbertofixed(eval(document.MainForm[End].value.replace(/\,/g,"")),5) - eval(document.MainForm[Start].value.replace(/\,/g,""));
document.MainForm[End].value = formatNum(eval(document.MainForm[End].value),"^#,###.5^");
document.MainForm[Change].value = formatNum(eval(vartotal),"^#,###.5^");
}
}
}
0
Author Commented:
thanks...

I just change the last statement formatNum(eval(vartotal),"^#,###.5^");

to vartotal.toFixed(5)

any other suggestion on the function would be helpful, I am very new to java and frankly don;t use it much except these calculation functions... here and there.

thanks, enjoy your day.
0
Commented:
There are parts of your function that seem repetitive or useless. For instance, what is the purpose of the FieldName variable?

if (document.MainForm[FieldName].value.replace(/\,/g,"") == ''|| isNaN(document.MainForm[FieldName].value.replace(/\,/g,""))){

if may be easier to use

var num = parseFloat(document.MainForm[End].value.replace(/,/g, ''));
if (isNaN(num)) {

Also,

if (document.MainForm[End].value == document.MainForm.oldvarstorage.value)
{}

does not seem necessary. It does not hurt to format the number again if it is the old one.
0
Author Commented:
cool. super thanks. look at it now...

note, I have another function which is compute change. It is virtually the same code, but I just changed field name, that is why I left it in there at the top

function ComputeChange5(Start, Change, End) {
var vartotal = 0;
var FieldName = End;
var Num = parseFloat(document.MainForm[FieldName].value.replace(/\,/g,""))

if (isNaN(Num))
{
document.MainForm[FieldName].value = formatNum(eval(document.MainForm.oldvarstorage.value.replace(/\,/g,"")),"^#,###.5^");
alert('You entered an invalid number')
document.MainForm[FieldName].focus();}
else
{
vartotal = eval(document.MainForm[End].value.replace(/\,/g,"")) - eval(document.MainForm[Start].value.replace(/\,/g,""));
document.MainForm[End].value = formatNum(eval(document.MainForm[End].value),"^#,###.5^");
document.MainForm[Change].value = vartotal.toFixed(5);
}
}
0
Author Commented:
sad is I also have a function

function ComputeChange2(Start, Change, End)

which just replaces all the 5's with 2's and return 2 deciaml place results...

it was easier for me to copy the code that incorporate the logic into the function and pass in another parameter... looking back it seems lazy to me... im guilty and will fix it.

thanks again for the advice.

Marc
0
Author Commented:
should I even be using eval and the format num?

how do I make the formatnum parameter, ,"^#,###.5^" dynamic, so I can pass in either a 2 or 5 to specify how many decimals I want...

I would like to award you some more points....

Marc
0
Commented:
It depends on how formatnum is coded. In fact, it may be easier to take out the .5 part of the format number and just use toFixed() explicitly.

If you want, you can always use something such as:

"^#,###." + VariableHoldingDecimalPlaces + "^"

Finally, you do need the majority of your eval() functions. You only need that if you have complex Javascript as a string and need to run it.
0
###### It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Java

From novice to tech pro — start learning today.