IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

round/ceil ne donnent pas un nombre


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Profil pro
    Développeur Web
    Inscrit en
    Octobre 2010
    Messages
    153
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2010
    Messages : 153
    Points : 107
    Points
    107
    Par défaut round/ceil ne donnent pas un nombre
    Bonjour.
    Je remarque quelque chose de bizarre dans un script tout simple. Je veux créer un tableau de résultats d'une requête MySQL en découpant les résultats dans 4 colonnes pour commodité de lecture. Je divise donc le nombre de résultats par 4 et je compte les lignes, je veux insérer une nouvelle cellule de tableau à chaque fois que j’atteins ce nombre, ce que je déduis en disant que la division "nombre de ligne écrites / nombre de lignes par cellule" est un entier.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $cut = ceil(mysql_num_rows($select) / 4);
    echo mysql_num_rows($select).'-'.$cut; //pour vérifier
    $i = 1;
    echo '<table border=0 align="center"><tr><td valign="top">';
    while ($db = mysql_fetch_array($select)){
    	if (is_int($i / $cut)) echo '</td><td valign="top">';
    	echo "$i-<a href=\"$dir/".str_replace($search, $replace, $db['trans']).".html\">$db[trans] ($l$db[n])</a><br>";
    	$i++;
    }
    echo '</td></tr></table>';
    ça ne coupe pas en cellules malgré que la ligne de vérification affiche bien un nombre entier.
    La fonction round à la place de ceil donne le même problème.
    Si mon test est if ($i == $cut) ça coupe bien mais seulement à cut, pas à ses multiples, bien sûr.
    La solution est de rajouter un intval() dans la ligne 1 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $cut = intval(ceil(mysql_num_rows($select) / 4));
    Et là je ne comprends pas la logique. ceil et round doivent renvoyer des entiers non ?!
    Le problème est réglé avec intval() mais j'aimerai comprendre le bug.

  2. #2
    Membre émérite
    Avatar de Kaamo
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    1 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 165
    Points : 2 778
    Points
    2 778
    Par défaut
    Non, elles ne retournent pas des entiers.

    http://php.net/manual/fr/function.ceil.php
    La valeur value arrondie à l'entier supérieur. La valeur retournée est un nombre à virgule flottante (nombre décimal), car ces nombres peuvent être plus grands que les entiers.
    round() permet d'arrondir à X décimales près, donc la valeur retournée n'est pas non plus un entier.

    Pour information, tu aurais pu te servir de l'opérateur modulo (%, qui donne le reste de la division entière de deux nombres. Ainsi, quand le reste vaut 0, tu insères ta nouvelle ligne).
    Si tu veux découper en 4 :
    au lieu de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (is_int($i / $cut)) echo '</td><td valign="top">';
    Se servir de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ($i % 4 == 0) echo '</td><td valign="top">';

  3. #3
    Membre régulier
    Profil pro
    Développeur Web
    Inscrit en
    Octobre 2010
    Messages
    153
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Octobre 2010
    Messages : 153
    Points : 107
    Points
    107
    Par défaut
    merci pour ta réponse.

    Pour moi un nombre avec aucun chiffre après la virgule (comme le donne ceil) est un nombre entier. Mais ce n'est pas la première fois que ma logique n'est pas la même que celle de PHP ! Merci pour cette explication qui répond clairement à ma question.

    pour modulo, j'avais oublié cette possibilité qui marche en effet sans problème, même avec un nombre sortit de ceil ou round. Du coup plus besoin de intval.

    Merci : question répondue et code mieux écrit

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 03/03/2015, 22h12
  2. erreur : " ceci n'est pas un nombre"
    Par fripette dans le forum Outils
    Réponses: 5
    Dernier message: 17/11/2013, 17h51
  3. Réponses: 6
    Dernier message: 19/03/2007, 12h09
  4. [SQL] Compter le nombre de dossiers, pas le nombre d'enregistrements
    Par lodan dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 11/01/2007, 20h42
  5. 50.00 n'est pas un nombre en virgule flottante correct
    Par Merfolk dans le forum C++Builder
    Réponses: 2
    Dernier message: 26/01/2006, 01h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo