2017-08-15 4 views
1

Mon problème est le suivant: log(1000,10) renvoie 3, mais floor(log(1000,10)) renvoie 2. Comment résoudre ce problème?Php log et le comportement étrange de la fonction de plancher

Ma version de php est 5.6.30-0 + deb8u1.

+0

Intéressant: https://3v4l.org/CemOL. – localheinz

+0

@localheinz Wtf ... avez-vous juste trouvé un bug? Je veux dire, sur le manuel de PHP, il n'y a rien d'écrit que la fonction a changé pour PHP7 + - http://php.net/manual/fr/function.floor.php – Twinfriends

+0

@Twinfriends Aucune idée, pour être honnête! – localheinz

Répondre

2

From a 13 year old comment at the PHP:log documentation:

$val = 1000000 
$val2 = floor(log($val,10)) // gives a value of 5 for $val2 and not 6 as expected. 
$val2 = floor(log10($val)) // gives the correct value. 

vous devez donc utiliser floor(log10(1000);

Bien que je ne suis certainement pas un expert, je pense que les différents résultats en PHP5 et PHP7 (comme indiqué dans les commentaires sur votre question) a à faire avec scalar type declaration, une nouvelle fonctionnalité de PHP 7 (essayez de jouer en mode strict pour en savoir plus, par exemple https://3v4l.org/KVCol).

5

Parce que log(1000) est quelque chose comme 2,9999999999999996 et le sol() fonction Arrondit un nombre entier le plus proche

si vous voulez avoir 3, utilisez ronde et non étage

+0

True. Le type du résultat sera toujours flottant, tout comme la note supplémentaire. – Twinfriends

+0

Je dois utiliser l'exposant dans la forme normale de l'entier, donc je ne peux pas utiliser round (pour 999 je dois retourner 2) – bmv

+0

vous pouvez toujours vérifier si c'est vraiment proche du nombre suivant. – sheplu

-1

Il peut lié à flotter précision . Vous pouvez utiliser log10 (1000) à la place.

+0

pourquoi me rejeter? S'il vous plaît essayez log10 (1000) et renvoyez un réel 3 –