Here is how I arrived at this:

var res:Number;

var a:Number = 5;
var b:Number = 4.8;

res = a - b;
trace("result: " + res + ", a: " + a + ", b: " + b);


The trace clearly shows that the value of a is 5, and the value of b
is 4.8. However the end result is clearly shown as 0.2000000000000018.

Ok, I wanted to create a workaround where I will make sure that b is
really 4.8, and I used toPecision() method.

var b1:String = b.toPrecision(2);
var b2:Number = Number(b1);
trace("b1: " + b1 + ", b2: " + b2);

res = a - b2;
trace("result: " + res + ", b1: " + b1 + ", b2: " + b2);


Again with same result. b2 was traced as 4.8, but the end result still
showing 0.2000000000000018. As this can of course break all further
calculations I had to make sure result is really holding a value that
it should, based on all mathematical logic. So I did this:

var res1:String = res.toPrecision(2);
res = Number(res1);

trace("result: " + res);

I got the expected result and the value of res is now 0.2.

This is however very ugly, in case I'm not doing something wrong.
Every time we expect a floating point value in our calculation we have
to handle it to ensure the proper value is calculated, because what
Flash calculates is just wrong. Also, every intermediate calculation
has to be stored in a variable converted to String with toPrecision
and back to Number for future use. I really don't know how to properly
handle this and would appreciate any advice. Imagine the shopping cart
system with this sort of unpredictable behavior. 

For the end, here's one more weirdness:

var c:Number = 488.8;

trace("c: " + c + " , c.toPrec: " + c.toPrecision(2));


Traces out c: 4.8, c.toPrec: 4.9e+2




Thanks,

Alen










var c:Number = 488.8;

Reply via email to