[RESOLU] Savoir lorsqu'un float est entier

Eléphanteau du PHP | 40 Messages

18 avr. 2017, 11:53

Bonjour,
J'ai un for qui incrémente de 0.01
for ($i = 0.0; $i <= 200; $i += 0.01)
et je cherche à faire des echos à chaque fois que mon compteur i atteint une valeur entière. J'utilise is_int()
if (is_int($i))
		{
			if ($iq1 == -1)
				echo number_format($i, 0) . " " . number_format($res, 2) . "\n";
			$res = 0;
		}
Mais ça ne marche pas, is_int() semble plus vérifier si la variable est de type int plutot que si la valeur est entière malgrés ce que dis la description de la doc PHP. Quelqu'un aurait-il une solution svp

Mammouth du PHP | 571 Messages

18 avr. 2017, 14:01

tu peux soustraire le nombre décimal avec sa partie entière.Puis comparer le résultat obtenu avec 0 ( >0 donc nombre décimal sinon nombre entier). Par exemple: ( 10.50 - 10 ) = 0.50. Or 0.50>0 donc 10.50 n'est pas entier.
 function isInteger($input){
        return ( $input - (int) $input ) > 0 ? false:true;
 }

var_dump( isInteger( 10.50) ); //false
var_dump( isInteger( 10.00) ); //true


Eléphanteau du PHP | 40 Messages

18 avr. 2017, 14:17

ça ne marche pas très bien, quand le compteur arrive à 1 par exemple j'obtiens
0.99 false
6.6613381477509E-16 false
0.010000000000001 false
0.020000000000001 false
0.030000000000001 false
0.040000000000001 false
0.050000000000001 false
0.060000000000001 false
0.070000000000001 false
0.080000000000001 false
0.090000000000001 false
0.1 false

Mammouth du PHP | 571 Messages

18 avr. 2017, 17:14

avec un filtre de validation
for ($i = 0.0; $i <= 200; $i += 0.01){
if( filter_var($i, FILTER_VALIDATE_INT)  ) 
  echo $i ."<br>";
else
  echo "$i n'est pas entier<br>";
}


Eléphanteau du PHP | 40 Messages

18 avr. 2017, 17:43

Ca ne marche pas non plus j'ai plein de valeur qui sautent, au final j'ai mis un compteur qui va jusqu'à 100 avant de se faire réinitialisé ça ça marche bien, j'aurai préféré faire moins sale mais bon

Eléphanteau du PHP | 40 Messages

19 avr. 2017, 09:08

ah tient en me levant j'ai réalisé que je pouvais faire un truc tout bête:
if ((int)($i * 100) % 100 == 0)
La nuit porte conseil comme on dit.

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

19 avr. 2017, 09:43

salut,

juste t'indiquer la raison du problème.
c'est à cause du fait que la représentation d'un entier est approximative (quelque soit le langage).
par exemple voici le passage de 198 à 199
198.99999999996
199.00999999996
pourtant tu as ajouté que 0.01

explication de la doc: http://php.net/manual/fr/language.types.float.php

souvent la solution est de travailler avec des entiers et de diviser par la bonne puissance de 10 ;)

@+
Il en faut peu pour être heureux ......