Re: Help. Floats turning into really small numbers? x.xxxxxxxxxxxxxxxxxxxxxxE-xx- Narrowed it down!

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



What you see as round numbers in base 10, are not so in binary.  Numbers 
such as .5, .25, .125, .0625 and so on, multiples of one half, are round 
numbers in binary, though they don't look so in decimal.

Others which look pretty simple in decimal are not, for example, 0.1 gives 
you an infinite series 0.11001100110011... in binary.  All this numbers give 
you rounding errors.

That is why many languages have introduced 'currency' or 'money' data types, 
they are either integer data types scaled back to a fixed number of decimal 
places, or they are floats rounded of the least significant digits.

You can do either by yourself, that is, have all currency internally 
represented as cents and scale it to full units when showing it, or round 
off at two cents after each calculation.

Satyam



"Anthony Tippett" <atippett@xxxxxxxxxx> wrote in message 
news:4251DA7C.9060500@xxxxxxxxxxxxx
> btw, thanks for your response.
>
> I'm not sure as if I understand why.  It's not like I'm using a very
> precise number when dealing with the hundreths place.
>
> Even without the multiplication the number gets messed up.
>
> eg.
>
> $a = 17.00;
> $a+= 1.10;
> $a+= 0.32;
> $a+= 0.07;
>
>
> print $a."<br>"; // 18.49
>
> var_dump($a);  // float(18.49)
> var_dump($a-18.49); // float(3.5527136788005E-15)
>
> I'm just trying to add money amounts?  Can I not rely on floats to do 
> this?
>
>
>
> Richard Lynch wrote:
>> Floats are NEVER going to be coming out "even" reliably.
>>
>> You'll have to check if the difference is less than X for whatever number
>> X you like.
>>
>> Or you can look at something like BC_MATH where precision can be carried
>> out as far as you like...
>>
>> But what you are seeing is to be expected.
>>
>> That's just the way computers work, basically.
>>
>> On Mon, April 4, 2005 5:07 pm, Anthony Tippett said:
>>
>>>Ok i've narrowed it down a little bit but still can't figure it out..
>>>
>>>Here's the code and what I get for the output.  Does anyone know what's
>>>going on?  Can someone else run it on their computer and see if they get
>>>the same results?
>>><?php
>>>
>>>$a = "17.00" * "1";
>>>$a+= "1.10" * "1";
>>>$a+= "0.32" * "1";
>>>$a+= "0.07" * "1";
>>>
>>>print $a."<br>"; // 18.49
>>>
>>>var_dump($a);  // float(18.49)
>>>var_dump($a-18.49); // float(3.5527136788005E-15)
>>>?>
>>>
>>>
>>>Anthony Tippett wrote:
>>>
>>>>I'm having trouble figuring out why subtraction of two floats are giving
>>>>me a very small number.  I'm thinking it has something to do with the
>>>>internals of type casting, but i'm not sure.  If anyone has seen this or
>>>>can give me some suggestions, please.
>>>>
>>>>I have 2 variables that go through a while loop and are
>>>>added/subtracted/ multipled. InvAmt and InvPay are shown as
>>>>floats but when they are subtracted, they give me a really small
>>>>number
>>>>
>>>>// code
>>>>var_dump($InvAmt);
>>>>var_dump($InvPay);
>>>>var_dump($InvAmt-$InvPay);
>>>>
>>>>// output
>>>>float(18.49)
>>>>float(18.49)
>>>>float(2.1316282072803E-14)
>>>>
>>>
>>>--
>>>PHP General Mailing List (http://www.php.net/)
>>>To unsubscribe, visit: http://www.php.net/unsub.php
>>>
>>>
>>
>>
>> 

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php


[Index of Archives]     [PHP Home]     [Apache Users]     [PHP on Windows]     [Kernel Newbies]     [PHP Install]     [PHP Classes]     [Pear]     [Postgresql]     [Postgresql PHP]     [PHP on Windows]     [PHP Database Programming]     [PHP SOAP]

  Powered by Linux