Bug #62465 [Com]: intval of floats
| From: | fabrizio at queensboro dot com | Date: | Mon, 02 Jul 2012 18:57:27 +0000 |
| Subject: | Bug #62465 [Com]: intval of floats | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-171696@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=62465&edit=1
ID: 62465
Comment by: fabrizio at queensboro dot com
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:
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
Previous Comments:
------------------------------------------------------------------------
[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] rasmus@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)
------------------------------------------------------------------------
[2012-07-02 16:47:24] rasmus@php.net
Floating point values have a limited precision. Hence a value might
not have the same string representation after any processing. That also
includes writing a floating point value in your script and directly
printing it without any mathematical operations.
If you would like to know more about "floats" and what IEEE
754 is, read this:
http://www.floating-point-gui.de/
Thank you for your interest in PHP.
You are going to want to round() and not truncate here.
------------------------------------------------------------------------
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