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 :

un problème d'entiers


Sujet :

Langage PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 16
    Par défaut un problème d'entiers
    bonjour à tous

    Je voudrais simplement retourner un nombre à 2 décimales multiplié par un million, dans un format integer (ie pas de 2.9E+06 ou autre), et j'ai des phénomènes plus qu'étranges.

    Ce qui est bizarre c'est que ça n'arrive que sur certaines valeurs, par exemple '2.09' : c'est ok avec 1.09 et 3.09, 2.19, 2.091 et 2.089, etc...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    $cpc = '2.09';
     
    echo $cpc * 1000000; // retourne la valeur correcte : 2090000
    echo "<br/>";
    echo (int)($cpc * 1000000); // retourne 2089999 !!
    echo "<br/>";
    echo (int)($cpc * 1000 * 1000); // retourne la valeur correcte.
     
    $cpc = '1.2';
    echo"<br/>";
    echo $cpc * 1000000; // retourne 1.2E+6
    echo "<br/>";
    echo (int)($cpc * 1000000); // retourne la valeur correcte : 1200000
    echo "<br/>";
    echo (int)($cpc * 1000 * 1000); // retourne la valeur correcte
    J'aurais donc tendance à dire d'utiliser le (int)($cpc*1000*1000) mais j'ai eu d'autres cas où ça ne fonctionnait pas... Est-il donc impossible en php de multiplier un nombre par un million ?? C'est incroyable, ce truc...
    J'ai soumis ça en bug à PHP mais on m'a répondu que c'était un problème de précision, ce que j'ai du mal à croire vu le script.

    Et j'ai l'impression (98% sûr) que ça n'arrivait pas avant de passer en v5.2 de PHP, je pense qu'en 5.0 ça fonctionnait correctement.

    Merci !
    Laurent

  2. #2
    Membre expérimenté
    Inscrit en
    Janvier 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 242
    Par défaut
    En gérant ça en mode chaine de caractére peut etre ?

    Faire un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    function mult1million($nb){
     
            $nb=(string)$nb;
    	if(preg_match('@.@',$nb)){
     
    		$tmp=explode('.',$nb);
     
    		$virg=$tmp[1];
     
    		for($i=strlen($tmp[1]);$i<6;$i++){
     
    				$virg.='0';
     
    		}
     
    		return $tmp[0].$virg;
     
    	}else{
     
    		for($i=0;$i<6;$i++){
     
    				$nb.='0';
     
    		}
     
    		return $nb;
     
    	}
     
    }
    $cpc="2.09"
     
    echo mult1million($cpc);

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 16
    Par défaut
    en fait c'est ce que je fais comme contournement à l'heure actuelle, je multiplie par 1000 et je concatène '000'.
    C'est quand même un truc de fou

  4. #4
    Membre expérimenté
    Inscrit en
    Janvier 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 242
    Par défaut
    Citation Envoyé par lolo92 Voir le message
    en fait c'est ce que je fais comme contournement à l'heure actuelle, je multiplie par 1000 et je concatène '000'.
    C'est quand même un truc de fou
    C'est une limitation d'u a l'arrondi en 32bits non ?

    Faudrait essayer sur un php compilé en 64bits pour voir.

  5. #5
    Membre Expert
    Inscrit en
    Janvier 2005
    Messages
    2 291
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 291
    Par défaut
    Citation Envoyé par chaced Voir le message
    C'est une limitation d'u a l'arrondi en 32bits non ?

    Faudrait essayer sur un php compilé en 64bits pour voir.
    Non, la valeur maximale d'un entier sur 32 bits et plutot vers les milliards (quand tu es en entier signé). Cf la doc:
    La taille des entiers dépend de la plate-forme de support, mais la valeur maximale est généralement de 2 milliards et des poussières (c'est un entier signé de 32 bits). PHP ne supporte pas les entiers non signés. La taille des entiers peut être déterminée depuis PHP_INT_SIZE, et la valeur maximale avec PHP_INT_MAX depuis PHP 4.4.0 et PHP 5.0.5.

  6. #6
    Membre expérimenté
    Inscrit en
    Janvier 2004
    Messages
    242
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 242
    Par défaut
    Citation Envoyé par koopajah Voir le message
    Non, la valeur maximale d'un entier sur 32 bits et plutot vers les milliards (quand tu es en entier signé). Cf la doc:
    Sauf que 2.09*1000000 c'est un float signé

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

Discussions similaires

  1. [XL-2003] Problème affichage entiers
    Par Fabiani dans le forum Excel
    Réponses: 2
    Dernier message: 23/06/2009, 23h42
  2. Problème entre entiers et réels
    Par Caroline_1 dans le forum Fortran
    Réponses: 5
    Dernier message: 08/03/2009, 14h02
  3. Problème cast entier/réel
    Par darkwall_37 dans le forum Débuter
    Réponses: 2
    Dernier message: 15/06/2008, 01h15
  4. Problème Class Entier
    Par stansoad0108 dans le forum Général Java
    Réponses: 4
    Dernier message: 03/01/2008, 20h00
  5. problème d'entier
    Par boucher_emilie dans le forum ASP
    Réponses: 7
    Dernier message: 13/07/2004, 17h52

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