Edit report at https://bugs.php.net/bug.php?id=62465&edit=1

 ID:                 62465
 Updated by:         ras...@php.net
 Reported by:        fabrizio at queensboro dot com
 Summary:            intval of floats
 Status:             Not a bug
 Type:               Bug
 Package:            *General Issues
 Operating System:   FreeBSD 9.0-RELEASE - amd64
 PHP Version:        5.4.4
 Block user comment: N
 Private report:     N

 New Comment:

That's exactly what round is for. You pass the rounding precision you want as 
an 
argument.


Previous Comments:
------------------------------------------------------------------------
[2012-07-02 18:57:27] fabrizio at queensboro dot com

Wouldn't make sense to have the conversion to INT work based on the precision ?

precision32:
 - intval(float(894.99999999999988631316227838397)) = 894
precision 14:
 - intval(float(894.99999999999988631316227838397)) = 895

------------------------------------------------------------------------
[2012-07-02 18:54:38] fabrizio at queensboro dot com

I never stop learning!!

Thank you very much !

------------------------------------------------------------------------
[2012-07-02 18:48:14] ras...@php.net

Well, that is just because your output precision is set low enough so when the 
value is printed it prints as 895. Try adding this to the top of your test 
script:

ini_set('precision',32);

And no, this isn't a modern language vs. old language thing. 

For example, in Python:
Python 2.7.3 (default, Apr 20 2012, 22:39:59) 
>>> a=8.9500
>>> print a*100
895.0
>>> from math import floor
>>> print floor(a*100)
894.0

The way to fix this is to use arbitrary precision math routines and every 
scripting language, including PHP (see gmp, bcmath) provides those, but they 
are 
so much slower than the cpu-provided floating routines that it is hard to 
justify.

------------------------------------------------------------------------
[2012-07-02 18:23:53] fabrizio at queensboro dot com

correct misspelled OS

------------------------------------------------------------------------
[2012-07-02 18:23:01] fabrizio at queensboro dot com

Very interesting.
Thank you for your link, I always assumed that this was an issue for old 
languages and that new ones would have corrected the conversion to integer 
using 
some sort of checking against the "to_string" (I am saying this without knowing 
what it takes or what the code looks like).

As you can see here, the code knows that the value is a float(895), without 
decimals, so the integer should be the same, else I would expect an output like 
float(894.99999999...) during the var_dump.

<?php
$grand_total = '8.9500';
var_dump(                                                            
        $grand_total,                                                
        $grand_total*100,                                            
        round($grand_total*100),                                     
        intval($grand_total*100)                                     
);                                                                   
?>


string(6) "8.9500"
float(895)
float(895)
int(894)

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


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

    https://bugs.php.net/bug.php?id=62465


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

Reply via email to