Précédent   Forum du club des développeurs et IT Pro > PHP > PHP & SGBD > PHP & ODBC
PHP & ODBC Forum d'entraide sur ODBC avec PHP. Avant de poster -> FAQ ODBC
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 18/07/2012, 09h46   #1
Smertrius
Invité de passage
 
Homme
Étudiant
Inscription : 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 : 3
Points : 3
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 :
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 :
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.
Smertrius est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/07/2012, 09h56   #2
Fench
Expert Confirmé
 
Avatar de Fench
 
Homme
Chercheur en informatique
Inscription : mai 2002
Messages : 2 346
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 346
Points : 3 231
Points : 3 231
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)
Fench est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 18/07/2012, 09h58   #3
Benjamin Delespierre
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 3 897
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 25
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 897
Points : 8 605
Points : 8 605
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.
__________________
On vous a menti
PHP, Injection de dépendances et composants
La POO en PHP en 10 minutes pour moins
Suivez-moi sur GitHub et Twitter

N'oubliez pas de vous servir des bouttons , et
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 18/07/2012, 10h14   #4
Smertrius
Invité de passage
 
Homme
Étudiant
Inscription : 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 : 3
Points : 3
Je vous remercie pour vos réponses rapide
Smertrius est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/07/2012, 10h32   #5
Benjamin Delespierre
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 3 897
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 25
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 897
Points : 8 605
Points : 8 605
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 :
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.
__________________
On vous a menti
PHP, Injection de dépendances et composants
La POO en PHP en 10 minutes pour moins
Suivez-moi sur GitHub et Twitter

N'oubliez pas de vous servir des bouttons , et
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 23h41.


 
 
 
 
Partenaires

Hébergement Web