J'ai ce code PHP :
$entityElementCount = (-($highScore-$totalKeywordCount))/0.29;
Ce que je veux savoir, c'est comment vérifier si $entityElementCount est un nombre entier (2, 6, ...) ou partiel (2,33, 6,2, ...).
Merci !
J'ai ce code PHP :
$entityElementCount = (-($highScore-$totalKeywordCount))/0.29;
Ce que je veux savoir, c'est comment vérifier si $entityElementCount est un nombre entier (2, 6, ...) ou partiel (2,33, 6,2, ...).
Merci !
Il ne s'agit pas tant d'une tentative de réponse à cette question. Il y a déjà beaucoup de réponses. Si vous faites des statistiques comme le suggère la question, je pense que la réponse de @antonio-vinicius-menezes-medei vous conviendra mieux. Cependant, j'avais besoin de cette réponse pour la validation des entrées. J'ai trouvé cette vérification plus fiable pour valider une chaîne d'entrée est un nombre entier :
is_numeric($number) && preg_match('/^[0-9]+$/', $number)
L'option "is_numeric" corrige simplement la conversion de "true" en "1" dans preg_match.
En jouant sur la réponse de @antonio-vinicius-menezes-medei. J'ai écrit un script pour tester ceci ci-dessous. Notez que le ini_set('precision', 20)
. preg_match convertira l'argument en une chaîne de caractères. Si votre précision est inférieure à la longueur des valeurs flottantes, elles seront simplement arrondies à la précision donnée. Similaire à la réponse de @antonio-vinicius-menezes-medei, ce paramètre de précision forcera une longueur d'estimation similaire.
ini_set('precision', 20);
$test_cases = array(0.29, 2, 6, 2.33, 6.2, '10.00', 1.4, 10, "10", 10.5, "0x539", true,
false, 0x53, 9.4, "ten", "100", 1, 0.999999997, 0, 0.0001, 1.0, 0.9999999,
(-(4.42-5))/0.29);
foreach ($test_cases as $number)
{
echo '<strong>';
var_dump($number);
echo '</strong>';
echo boolFormater(is_numeric($number) && preg_match('/^[0-9]+$/', $number));
echo '<br>';
}
function boolFormater($value)
{
if ($value)
{
return 'Yes';
}
return 'No';
}
Ce qui produit cette sortie :
float(0.28999999999999998002) Non
int(2) Oui
int(6) Oui
float(2.3300000000000000711) Non
float(6.2000000000000001776) Non
string(5) "10.00" Non
float(1.3999999999999999112) Non
int(10) Oui
string(2) "10" Oui
float(10.5) Non
string(5) "0x539" Non
bool(true) Non
bool(false) Non
int(83) Oui
float(9.4000000000000003553) Non
string(3) "dix" Non
string(3) "100" Oui
int(1) Oui
float(0.99999999699999997382) Non
int(0) Oui
float(0.00010000000000000000479) Non
float(1) Oui
float(0.99999990000000005264) Non
float(2.0000000000000004441) Non
Juste pour partager ma solution avec la chaîne/le nombre localisé, cette combinaison a fonctionné comme un charme pour moi.
public static function isWholeNumber ($input, $decimalDelimiter = ',')
{
if (is_string($input)){
$input = str_replace($decimalDelimiter, '.', $input);
$input = floatval($input);
}
if (fmod($input,1) !== 0.0) {
return false;
}
return true;
}
Version améliorée de la solution de @Tyler Carter, qui gère mieux les cas limites que l'original :
function is_whole_number($number){
return (is_float(($f=filter_var($number,FILTER_VALIDATE_FLOAT))) && floor($f)===$f);
}
(le code de Tyler ne reconnaît pas que la chaîne "123foobar" n'est pas un nombre entier. cette version améliorée ne fera pas cette erreur. crédits à @Shafizadeh dans les commentaires pour avoir découvert le bogue. aussi c'est php7 strict_types=1
-compatible)
Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.