NYCPHP Meetup

NYPHP.org

[nycphp-talk] Unfriendly Float Handling

tedd tedd at sperling.com
Fri Mar 31 18:08:42 EST 2006


At 4:58 PM -0500 3/31/06, Tim McEwen wrote:
>I apologize if this has already been discussed to death here but I 
>would love to hear people's thoughts on it.    I am trying to justify 
>to a colleague why the behavior below is not a massive flaw in PHP.   
>To a new programmer,   the following code should result in  $a being 
>equal to $b:
>
>$a="49.95" + "3.95";   // or even  $a = 49.95 + 3.95;
>$b=53.90;
>
>Unfortunately floats in PHP are subject to the same problems you find 
>in many languages with fixed precision.   So due to rounding, in this 
>case $a is not equal to $b.     This behavior is documented in the 
>manual:  http://www.php.net/manual/en/
>language.types.float.php#AEN3375    Straight from the manual:  "So 
>never trust floating number results to the last digit and never 
>compare floating point numbers for equality."   Come again?  Never 
>compare floating point numbers for equality?   And thats not a bad 
>thing?
>
>Given the fact that PHP is so easy to learn and that it is very 
>commonly used for financial related tasks such as ecommerce,  doesn't 
>it stand to reason that people will assume that they can use the 
>internal PHP operators on dollar amounts?   Since many people are 
>going to just assume they can do math in a natural manner,  shouldn't 
>PHP a little more proactive to ensure that developers won't get 
>burned by this?
>
>I've spoken to a few php contributors about this have had very little 
>interest in tackling this issue.  The "official" answer is that if 
>you are doing math on fixed precision numbers you should use either 
>the bc or gmp but these extension as not even enabled by default.
>
>  From what I understand,  there would be a speed penalty for 
>detecting and dealing with fixed percision numbers.  Some people 
>might not mind the speed hit so why not make it a configurable 
>choice?  Or why not create a built in fixed precision type?  Whatever 
>the case, I think PHP needs a built in solution that does not rely on
>extensions. Thoughts?

Thoughts?

if ($a < $b + .01 && $a > $b - .01)
    {
    echo("Yes, close enough.");
    }
else
    {
    echo("No");
    }

Or to whatever precision you want.

tedd
-- 
--------------------------------------------------------------------------------
http://sperling.com



More information about the talk mailing list