Bug #78492 [Com]: Comparing Value from equation to 100
| From: | a at b dot c dot de | Date: | Thu, 05 Sep 2019 00:40:59 +0000 |
| Subject: | Bug #78492 [Com]: Comparing Value from equation to 100 | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-222566@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=78492&edit=1
ID: 78492
Comment by: a at b dot c dot de
Reported by: email at brunofaria dot pt
Summary: Comparing Value from equation to 100
Status: Not a bug
Type: Bug
Package: *Math Functions
Operating System: Windows 10
PHP Version: 7.3.9
Assigned To: cmb
Block user comment: N
Private report: N
New Comment:
You should be checking that the result is within a range that depends on the accuracy of your
numbers and what you're doing with them. In this case, adding numbers are accurate to one
decimal place means that a result of 100 (strictly, 100.0) could in fact be anything between 99.95
and 100.05. (The real range won't be anywhere near that bad unless you're adding a LOT of
numbersâin which case you maybe ought to change scale and work with integersâbecause the
internal representation is much more precise than that.)
But it should be obvious that adding numbers with one-decimal-place accuracy will always produce a
sum with one decimal place of accuracy, so any additional "accuracy" than that must
therefore be a consequence of the approximations needed to represent all of the numbers involved
with a fixed non-decimal precision.)
So in this case, you want to round the sum off two one digit of accuracy and then compare:
round(61.8 + 20.1 + 11.4 + 6.7, 1) == 100.0
Previous Comments:
------------------------------------------------------------------------
[2019-09-04 20:10:14] phpbugreports at gmail dot com
> You should always compare floats with <, >, <= or >=
for sure not
> In your case, make it $value>99.999 and you'll be good
even not for that isolated case because it would be >= 100 instead == 100 but not
"99.9" with a random count of 9 added at the end
what you always should do is be as explicit as you can and > is the exact opposite, properly cast
your values before compare and use === and !== where ever you can
------------------------------------------------------------------------
[2019-09-04 20:04:30] sinus at sinpi dot net
You should always compare floats with <, >, <= or >=. In your case, make it
$value>99.999 and you'll be good.
------------------------------------------------------------------------
[2019-09-04 17:58:54] phpbugreports at gmail dot com
convert to strings is sonsense even if it works by luck, limited precision was already explained,
the value is something like "100.0000000000000142108547152020037174224853515625"
if(100 == (int)$value)
if(100 === (int)$value)
one of both would work
<?php
$value = 61.8 + 20.1 + 11.4 + 6.7;
ini_set('precision', 1000);
if(100 == (int)$value)
{
echo "true: $value\n";
}
else
{
echo "false: $value\n";
}
?>
------------------------------------------------------------------------
[2019-09-04 17:47:12] email at brunofaria dot pt
I think I'm going to convert both values to strings and them compare them to work around this
problem.
------------------------------------------------------------------------
[2019-09-04 17:35:31] email at brunofaria dot pt
Doesn't matter if its == or === always returns false.
Also, the result from the foreach loop is exactly '100' and I'm comparing to 100 ,
its the same string representation.
------------------------------------------------------------------------
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=78492
--
Edit this bug report at https://bugs.php.net/bug.php?id=78492&edit=1