Problème d'entier

Moderator: Mod

Problème d'entier

Postby SHEPSHEP » Thu Nov 10, 2011 3:54 pm

Yep,

J'ai un truc qui me turlupine.
Lorsque j’essaie d'afficher un gros entier (numéro SIRET sur 14 digits)
[code:1:9c77495147]echo "45817145900057";[/code:1:9c77495147]

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

Si je remplace les "0" par des "1"
[code:1:9c77495147]echo "45817145911157";[/code:1:9c77495147]

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
SHEPSHEP
Projets
 
Posts: 268
Joined: Wed Apr 08, 2009 11:14 am
Location: /dev/null

Postby WapiFlapi » Thu Nov 10, 2011 4:00 pm

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.
User avatar
WapiFlapi
Projets
 
Posts: 6
Joined: Thu Feb 28, 2008 12:33 am

Postby SHEPSHEP » Thu Nov 10, 2011 4:08 pm

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:
SHEPSHEP
Projets
 
Posts: 268
Joined: Wed Apr 08, 2009 11:14 am
Location: /dev/null

Postby TorTukiTu » Thu Nov 10, 2011 5:06 pm

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:

[quote:6665669f12]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[/quote:6665669f12]

=> 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.
User avatar
TorTukiTu
Site Admin
 
Posts: 1960
Joined: Thu Feb 07, 2008 10:24 pm
Location: Devant son pc durant la redaction de ce message

Postby Manu404 » Thu Nov 10, 2011 11:07 pm

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 :)
User avatar
Manu404
 
Posts: 2219
Joined: Tue Feb 26, 2008 3:44 pm
Location: ::1:

Postby SHEPSHEP » Mon Nov 14, 2011 9:56 am

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:
SHEPSHEP
Projets
 
Posts: 268
Joined: Wed Apr 08, 2009 11:14 am
Location: /dev/null


Return to Php

Who is online

Users browsing this forum: No registered users and 2 guests

cron