DEV Community

Dimitri Acosta
Dimitri Acosta

Posted on

Why is this code not working?

A few days ago I saw someone asking why this code is not reaching the third var_dump, so I tried to execute this in my computer, with all the different versions of PHP available and it is not working on any of them so, what's going on here?

I've tried changing the code in many ways and it never reaches the third var_dump, it's driving me crazy

<?php

$test = 9.99;
if ($test == 9.99) {
    var_dump($test);
}

$test = $test + 30;
if ($test == 39.99) {
    var_dump($test);
}

$test = $test + 30;
if ($test == 69.99) {
    var_dump($test);
} 
Enter fullscreen mode Exit fullscreen mode

Top comments (4)

Collapse
 
andy profile image
Andy Zhao (he/him) • Edited

Hmm, don't know PHP but it might be something to do with floats (numbers that have really long decimal places). Basically, when you do some math to a number that involves a decimal place, there's usually some weird precision going under the hood.

Gonna paste in this excellent answer by catalin dot luntraru that I found from the PHP docs:

$x = 8 - 6.4;  // which is equal to 1.6
$y = 1.6;
var_dump($x == $y); // is not true

PHP thinks that 1.6 (coming from a difference) is not equal to 1.6. To make it work, use round()

var_dump(round($x, 2) == round($y, 2)); // this is true

This happens probably because $x is not really 1.6, but 1.599999.. and var_dump shows it to you as being 1.6.

And with your example, comparing the rounded numbers will hit the final if statement:



Collapse
 
dimitri_acosta profile image
Dimitri Acosta

This is kinda awkward because now I'm not sure if I can rely on my code

Collapse
 
alephnaught2tog profile image
Max Cerrina

Floating point arithmetic!

This shows it nicely:

<pre>
<?php

$test = 9.99;
print_r("test should be 9.99: $test\n");
if ($test == 9.99) {
    var_dump($test);
}

$test = $test + 30;
print_r("\ntest should be 39.99: $test\n");
if ($test == 39.99) {
    var_dump($test);
}

//$test = $test + 30.00;
$test = $test + 30;
print_r("\ntest should be 69.99: $test\n");

$notZero = $test - 69.99;
print_r("\n\$test - 69.99 should be 0?: \n" . $notZero);
// shows: 
// 1.4210854715202E-14
if ($test == 69.99) {
    var_dump($test);
}

// testing here too...
$test = $test + 10;
print_r("\ntest should be 79.99: $test<br/>");

if ($test == 79.99) {
    var_dump($test);
}
?>
</pre>
Collapse
 
dimitri_acosta profile image
Dimitri Acosta

I didn't noticed that the subtraction throws those decimals, thanks for your answer.