Re: sprintf() oddity

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

 



On Tue, April 18, 2006 10:19 am, Chris Boget wrote:
> What's going on here:
>
> $number = 5000000000.1234567890;
> echo sprintf( '%.05f', $number );
>
> result: 5000000000.12346
>
> $number = 5000000000000.1234567890;
> echo sprintf( '%.05f', $number );
>
> result: 5000000000000.12305
>
> $number = 5000000000000000.1234567890;
> echo sprintf( '%.05f', $number );
>
> result: 5000000000000000.00000
>
> Why isn't it formatting the decimals properly? And apparently losing
> some?
>
> Running PHP 4.3.11 on Windows Server 2003 box.

PHP stores float/decimal numbers internally in 4-byte (32-bit) values
using standard C float libraries.

Rounding things off is guaranteed to produce results like this.

Though the one that ends in .12305 is a bit odd...

Still, if you NEED any sort of verifiable accuracy or especially large
scale, you'll have to use a custom library that deals with decimal
numbers as strings and allows you to choose arbitrary precision.

You'll sacrifice speed, of course.  And RAM.  How much you sacrifice
depends on how much accuracy you need, to some degree, but it's also
just inherently slower and more resource-intensive to do all the
calculations as strings.

-- 
Like Music?
http://l-i-e.com/artists.htm

-- 
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