S'enregistrer | Rechercher | FAQ | Liste des Membres | Groupes d'utilisateurs | Connexion

  Nom d'utilisateur:    Mot de passe:       

  

Poster un nouveau sujet   Répondre au sujet Page 1 sur 1
Voir le sujet précédent :: Voir le sujet suivant  
Auteur Message
MessagePosté le: Jeu Nov 10, 2011 3:54 pm    Sujet du message: Problème d'entier Répondre en citant

SHEPSHEP
Projets


 
Inscrit le: 08 Avr 2009
Messages: 268
Localisation: /dev/null



Yep,

J'ai un truc qui me turlupine.
Lorsque j’essaie d'afficher un gros entier (numéro SIRET sur 14 digits)
Code:
echo "45817145900057";


PHP me retourne la valeur en puissance de 10 : 4.58171459E+13

Si je remplace les "0" par des "1"
Code:
echo "45817145911157";


Cette fois ci PHP me retourne la valeur arrondie : 45817145911100

Après quelques test, j'ai pu déduire que jusqu’à 12 digits tout ce passais bien mais qu'a partir de 13 digits PHP fais ce qui lui chante..

Encore plus fort, ceci concerne uniquement ma machine de DEV.
La machine de PROD supporte 18 digits sans broncher mais au 19e elle déraille aussi.

Quelqu'un aurais une explication à cette bizarrerie ??

++
2ShEp
Voir le profil de l'utilisateur Envoyer un message privés Visiter le site web de l'utilisateur
MessagePosté le: Jeu Nov 10, 2011 4:00 pm    Sujet du message: Répondre en citant

WapiFlapi
Projets


 
Inscrit le: 28 Fév 2008
Messages: 6



32bit pour la machine de dev 64 en prod

sauf si tu veut faire des calculs dessus je te sugere de stocker tes numero de siret en chaine de caractere.

check du bc_add et compagnie sinon.
Voir le profil de l'utilisateur Envoyer un message privés MSN Messenger
MessagePosté le: Jeu Nov 10, 2011 4:08 pm    Sujet du message: Répondre en citant

SHEPSHEP
Projets


 
Inscrit le: 08 Avr 2009
Messages: 268
Localisation: /dev/null



J'y est pensé à l'histoire 32 / 64 bits mais normalement en 32 bits je ne devrais pas pouvoir dépasser 2^32 soit 4 294 967 296 alors que je peux allez jusqu’à "999 999 999 999" sans que ça déraille...

J'ai déjà passé le SIRET en chaine de caractère mais je voudrais juste comprendre Wink
Voir le profil de l'utilisateur Envoyer un message privés Visiter le site web de l'utilisateur
MessagePosté le: Jeu Nov 10, 2011 5:06 pm    Sujet du message: Répondre en citant

TorTukiTu
Site Admin


 
Inscrit le: 07 Fév 2008
Messages: 1960
Localisation: Devant son pc durant la redaction de ce message



SHEPSHEP,

Tu ne fais jamais d'opérations de calcul sur les siren => Tu dois les traiter comme des strings.

Extrait du manuel de php:

Citation:
The size of an integer is platform-dependent, although a maximum value of about two billion is the usual value (that's 32 bits signed). 64-bit platforms usually have a maximum value of about 9E18. PHP does not support unsigned integers. Integer size can be determined using the constant PHP_INT_SIZE, and maximum value using the constant PHP_INT_MAX since PHP 4.4.0 and PHP 5.0.5


=> taille des entiers plate-forme dépendant. Vérifie ton PHP_INT_MAX.

Sache aussi que si php rencontre un nombre trop grand, il le caste automatiquement en float.

4.58171459E+13 => a été casté en float. (probablement sur un 32 bits)

45817145911100 => est un integer

Tu devrais pouvoir vérifier mon hypothèse en vérifiant les types.

Après, 45817145911100 > 4.58171459E+13 Donc ton résultat n'est pas logique. Es-tu sûr que les deux résultats viennent bien du même système?

Tortue 974.
Voir le profil de l'utilisateur Envoyer un message privés Visiter le site web de l'utilisateur Compte AIM MSN Messenger Numéro ICQ
MessagePosté le: Jeu Nov 10, 2011 11:07 pm    Sujet du message: Répondre en citant

Manu404
Modérateur


 
Inscrit le: 26 Fév 2008
Messages: 2219
Localisation: ::1:



Tortu, je ne vois pas le problème, le nombre est le même mais affiché de manière différente et avec une limite par défaut sur la profondeur d’approximation. (vu que un float n'est qu'une approximation du nombre).
La théorie des float est très longue, des livres entiers (sans jeux de mots) y sont dédié.
Alors en plus en php ou le typage est définis a l'initialisation et qui est très gourmand en covariance et contra variance.

Bref le problème est lié a la plateforme, ton numéro en 14 digit, go to string Smile
Voir le profil de l'utilisateur Envoyer un message privés Envoyer un e-mail Visiter le site web de l'utilisateur Messagerie Instantanée MSN Messenger
MessagePosté le: Lun Nov 14, 2011 9:56 am    Sujet du message: Répondre en citant

SHEPSHEP
Projets


 
Inscrit le: 08 Avr 2009
Messages: 268
Localisation: /dev/null



Merci pour toutes ces précisions.

Comme la théorie des float ne m'attire pas plus que ça et que "contra variance" c'est pas dans mon vocabulaire je ne vais pas chercher plus loin Wink
Voir le profil de l'utilisateur Envoyer un message privés Visiter le site web de l'utilisateur
Poster un nouveau sujet   Répondre au sujet Page 1 sur 1

  


 
Sauter vers:  
Vous ne pouvez pas poster de nouveaux sujets dans ce forum
Vous ne pouvez pas répondre aux sujets dans ce forum
Vous ne pouvez pas éditer vos messages dans ce forum
Vous ne pouvez pas supprimer vos messages dans ce forum
Vous ne pouvez pas voter dans les sondages de ce forum



110251 Attacks blocked