ID:               43053
 Comment by:       ali at adcworks dot com
 Reported By:      owner at dragon-hearts dot net
 Status:           Verified
 Bug Type:         Scripting Engine problem
 Operating System: Centos4
 PHP Version:      5CVS-2007-10-25
 New Comment:

I am receiving longs via SOAP responses which represent IDs of
accounts. Due to some issue with PHP and long values when we retrieve
accounts using the same IDs we receive, we get other peoples' accounts
back - not good!

I have found the core problem and the snippet of code below shows that
the correct ID of 285000000003622757 is transformed into the incorrect
ID of 285000000003622752 (last number goes down 5).

<?php
$long = 285000000003622757;
function f0($long) { return $long; }
function f1($long) { return sprintf ( "%.0f", $long ); }
function f2($long) { return number_format($long, 0, '.', ''); }
?>
<h1>F0 (no formatting) </h1>
<?= f0($long) ?>
<h1>F1 (sprintf) </h1>
<?= f1($long) ?>
<h1>F2 (number_format) </h1>
<?= f2($long) ?>

OUTPUT
======

F0 (no formatting)
2.85000000004E+17
F1 (sprintf)
285000000003622752
F2 (number_format)
285000000003622752


Previous Comments:
------------------------------------------------------------------------

[2008-04-04 17:46:57] admin at vr-realty dot com

I had a working database for my office Stock Trading Pool when
AAAHHHHkkk 1.23E+007. The non programmers there were all freaked the
hell out. They thought E meant Error and that we had lost all of our
money. trying to tell 70+ people, that haven't seen Scientific notation
since they were in 9th grade, that it's not a problem and we will fix it
was no easy task. By the time it was brought to my attention people had
already started trying to figure out how to sue me for losing their
money, yeah it was a mess. And they didn't know that what they see is
just a thing for them to see and reference and really could be forgotten
and not updated for days. 

anyways 

I wen through and changed the MySql DB from floats to VarChars. and
type casted the $vars I pulled from the DB to float using

$curprice = (float)$price;
 and the ones that could be int like the number of shares
$curshares = (int)$shares;
 then I did the math
$total = (float)($price*$shares);

now the General population is feeling at ease and the death threats
have subsided. I'm still trying to understand why Scientific notation
would come into play.

maybe it sould be an obscure function like INT_TO_SCI($var) or
num_to_sci($var) ..

like the automatic and natural way to have the numbers over millions
sould be preserved as a whole long string no matter what the length with
the option to convert it to scientific notation if that suits your
needs.

my 2cents

------------------------------------------------------------------------

[2008-03-06 15:56:45] rbro at hotmail dot com

I agree - to me, this is a BC break that wasn't listed on any changelog
or announcement.  I have been holding off on upgrading my PHP version to
anything later than 5.2.1 because of this issue.

------------------------------------------------------------------------

[2008-03-04 23:07:43] tech at dragonara dot net

We have the same bug, and really - cPanel does not support 5.1 anymore,
so we are really in stupid situation.

------------------------------------------------------------------------

[2008-02-09 13:20:23] lhfagundes at gmail dot com

This gets bad if the float is casted to string (which happens if it
goes through requests):

$x = 1200000000.00;
echo $x . "\n";
echo (int)$x . "\n";
$x = "$x";
echo (int) $x . "\n";

In PHP 4.4.2 (I guess in earlier php5 too)

1200000000
1200000000
1200000000

now:

1.2E+9
1200000000
1

------------------------------------------------------------------------

[2008-01-28 13:39:47] gcleaves at yahoo dot com dot au

Same problem:

PHP Version 5.2.4
Windows NT HGCT-SQL 5.2 build 3790
Apache 2.0 Handler

------------------------------------------------------------------------

The remainder of the comments for this report are too long. To view
the rest of the comments, please view the bug report online at
    http://bugs.php.net/43053

-- 
Edit this bug report at http://bugs.php.net/?id=43053&edit=1

Reply via email to