Re: Floats and avoid exponential notation - How?
| From: | Kirk dot Johnson at zootweb dot com | Date: | Thu, 17 Jul 2008 16:40:15 +0000 |
| Subject: | Re: Floats and avoid exponential notation - How? | ||
| References: | 1 | Groups: | php.general |
| Request: | Send a blank email to php-general+get-276976@lists.php.net to get a copy of this message | ||
"k bah" <kbah@linuxmail.org> wrote on 07/17/2008 05:23:40 AM:
> Hi,
>
> From http://www.php.net/manual/en/language.types.float.php
> (second
comment in
> that page, from "kjohnson at zootweb dot com"):
>
> "PHP switches from the standard decimal notation to exponential notation
for
> certain "special" floats.
>
> I have the same problem. I have a big number I have to represent, it's
> usually "1" followed by 10 "zeros", the biggest value I'll
> have for it is 19999999999, never more than this. I only make one
operation
> with it, (+), most of the time I need that number as a
> string, and never need it's float representation, only the absolute
value (in
> fact, it's never going to have a fractional part). I
> cannot use integers because it's bigger than the integer range.
>
> If it goes to it's exponential representation, breaks my code. Users
are
> identified by that number.
>
> So, any suggestions/thoughts?
> Is there a way to prevent php from using the exponential notation for a
float?
I don't know of any way to modify PHP's behavior with regard to this.
That's not to say there isn't a way, but I don't know of one.
This might be a brute force way to address it. You'll want to add
additional checks so you don't end up in any infinite loops. You should
definitely test with larger numbers in the range that you are actuallly
using. Hope this gets you what you need:
// example: one of the "special" ones, prints in exponential notation,
"1.4E+6"
$num = 1400000.;
if(strstr($num, 'E')) {
echo "yep, exp notation<br>";
list($significand, $exp) = explode('E', $num);
list($void, $decimal) = explode('.', "$significand");
$decimal_len = strlen("$decimal");
$exp = str_replace('+', '', "$exp");
$exp -= $decimal_len;
$append = '';
for($i = 1; $i <= $exp; $i++) {
$append .= '0';
}
$tmp = str_replace('.', '', "$significand");
$reconsctructed = "$tmp" . "$append";
echo '<pre>reconstructed: ', "$reconsctructed",
'</pre>';
}
kjohnson at zootweb dot com :)