Gergely Králik
Gergely Králik

Reputation: 441

PHP for loop displaying strange results

I have this code:

for($i = 1; $i <= $max; $i+=0.1) {
    echo "$i<br>";
}

if the variable $max = 6; the results are: 1, 1.1, 1.2, 1.3 .... 5.8, 5.9, 6 , but when the variable $max = 4 the results are: 1, 1.1 ... 3.8, 3.9, but the number 4 is missing.

Please explain this behavior, and a possible solution to this.

the results are the same when i use the condition $i <= $max; or $i < $max;

The bug occurs when $max is 2, 3 or 4

Upvotes: 4

Views: 142

Answers (4)

user2984014
user2984014

Reputation: 26

You should set the precision when using integers,

like this:

$e = 0.0001;
   while($i > 0) {
   echo($i);
   $i--;
}

Upvotes: 1

Ranjitsinh
Ranjitsinh

Reputation: 49

  You can use of number_format()

<?php
$max=6;
for($i = 1; number_format($i,2) < number_format($max,2); $i+=0.1) {
echo $i."<br>";     
}

?>

Upvotes: 2

Expedito
Expedito

Reputation: 7805

$err = .000001//allowable error
for($i = 1; $i <= $max+$err; $i+=0.1) {
    echo "$i<br>";
}

Upvotes: 2

bitWorking
bitWorking

Reputation: 12675

From http://php.net/manual/en/language.types.float.php

Additionally, rational numbers that are exactly representable as floating point numbers in base 10, like 0.1 or 0.7, do not have an exact representation as floating point numbers in base 2, which is used internally, no matter the size of the mantissa. Hence, they cannot be converted into their internal binary counterparts without a small loss of precision.

So to overcome this you could multiply your numbers by 10. So $max is 40 or 60.

for($i = 10; $i <= $max; $i+=1) {
    echo ($i/10).'<br>';
}

Upvotes: 4

Related Questions