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

PHP & Base de données Discussion :

Extraction d'un float, problème sur les décimales [ODBC]


Sujet :

PHP & Base de données

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2012
    Messages : 4
    Points : 5
    Points
    5
    Par défaut Extraction d'un float, problème sur les décimales
    Bonjour,

    Je travail en PHP 5.4.3 et SQL server 2005 en utilisant les procédures de connexion odbc.

    Lors d'un ajout d'une valeur en float dans la base de données aucun problème, mais lorsque je veux extraire ces valeurs, si la dernière valeur est un float alors il modifie le nombre de décimal :

    A l’insertion 65.3
    Dans la base de donnée 65.3
    A l'affichage 65.299999999999997

    Ce problème ne se pose que sur le dernier nombre décimal affiché.

    Juste pour information le but est d'aller chercher des montants associé a des dispositifs

    Voici le code PHP :
    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
     
    <?php
    	header('Content-Type: text/html; charset=ISO-8859-1');
    	$username="user";
    	$password="mdp";
    	$db="BDD";
    	$server="192.168.1.14\SQLEXPRESS";
     
    	$connect=odbc_connect("DRIVER={SQL Server};SERVER=$server;DATABASE=$db", $username, $password);
     
    	$rsql="SELECT id_dispositif, libelle_dispositif FROM DISPOSITIF";
    	$resultat=odbc_exec($connect, $rsql);
    	while(odbc_fetch_row($resultat))
    	{	
    		$rsql2="SELECT montant_financement 
    				FROM FINANCEMENT
    				WHERE id_dispositif='".odbc_result($resultat,"id_dispositif")."'
    				AND id_financeur='".$_GET['id']."'";
    		$resultat2=odbc_exec($connect, $rsql2);	
    		$value="";
    		while(odbc_fetch_row($resultat2))
    		{
    			$value=odbc_result($resultat2,"montant_financement");
    		}
    		echo "<input type='text' id='TB".$i."' name='".odbc_result($resultat,"id_dispositif")."' value='".$value."' onKeyPress='return controle_chiffre(event);'>";			
    	}
    	odbc_close($connect);
    ?>
    J'ai trouvé la solution pour masqué le problème :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $value = number_format($value, 2, '.', '');
    Mais je voudrai savoir pourquoi il ne me l'affiche pas correctement comme il est affiché dans la base de donnée.

    Merci.

  2. #2
    Membre expert Avatar de Fench
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Mai 2002
    Messages
    2 353
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Groenland

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2002
    Messages : 2 353
    Points : 3 390
    Points
    3 390
    Par défaut
    Bonjour,

    J'avais vu un truc dans le même genre, il y aune semaine ou deux, alors après quelques pages en arrière j'ai retrouvé

    Tu auras peut être la réponse à la question mais en tous les cas la réponse à ton problème ... regardes ici
    Meuuh en AI à l'INRA
    Domaines: {java, php, js, jquery}{hibernate, doctrine}{MyLib, symfony, Zend}
    fait gagner du temps à ceux qui aident , donc un message avec la balise résolu laisse plus de temps pour résoudre d'autres problèmes (balise à cliquer en bas de l'écran)

  3. #3
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Si je me rappelle bien de mes cours d'architecture, ce problème est dû à l'encodage de ton réel sur une base 2, certains nombres finis en base 10 se retrouvent irrationnels quand on change leur base, d'ou l'erreur d'arrondi que tu remarques. Pour mieux comprendre, lire l'article sur Wikipedia.

  4. #4
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2012
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2012
    Messages : 4
    Points : 5
    Points
    5
    Par défaut
    Je vous remercie pour vos réponses rapide

  5. #5
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    Il faut également faire extrèmement attention au cast implicite en PHP.

    Voici une erreur qu'on rencontre régulièrement avec des chaines de caractères:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $a = ".198195121599519519215895195151611";
    $b = ".198195121599519519215895195151612";
    
    var_dump($a == $b ); // true (wtf ?)
    var_dump($a === $b); // false
    Dans le premier cas (égalité simplie ==), $a et $b sont implicitement transformés en flottants et l'erreur d'approximation cité plus haut fait que PHP croit que ces deux nombres sont égaux (en réalité, l'égalité sur des flottants pourrait se traduire par "sont pratiquement égaux").
    Dans le second cas (égalité stricte ===), $a et $b ne sont pas castés et la comparaison est effectuée en interne par le moteur à l'aide d'un memcomp (comparaison mémoire binaire), donc là le résultat est juste (mais c'est de la magie noire - dixit Julien Pauli). Le même résultat aurait été obtenu avec strcmp.

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

Discussions similaires

  1. Problème sur les selects multiples
    Par Nag_Champa dans le forum Langage
    Réponses: 4
    Dernier message: 15/12/2006, 16h02
  2. Problème sur les dates
    Par Littlecoda dans le forum Oracle
    Réponses: 7
    Dernier message: 07/07/2006, 11h39
  3. problème sur les threads et les sémaphores
    Par ramislebob dans le forum Windows
    Réponses: 1
    Dernier message: 29/06/2006, 11h52
  4. Réponses: 6
    Dernier message: 31/03/2006, 17h05
  5. j'ai un problème sur les hinstances
    Par ramaro dans le forum C++
    Réponses: 9
    Dernier message: 26/02/2006, 14h32

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