Précédent   Forum des professionnels en informatique > PHP > Langage > Débuter
Débuter Forum d'entraide pour débuter en PHP. Avant de poster -> Cours PHP, FAQ PHP, Outils PHP, etc.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 19/11/2010, 06h52   #1
Membre du Club
 
Inscription : août 2005
Messages : 171
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 171
Points : 40
Points : 40
Par défaut décimaux et imprécision à l'affichage

Bonjour, j'ai un petit problème avec des float.

Voici un exemple très parlant :
Code :
1
2
3
4
5
6
 
$toto = 56.6 + 7.5; echo $toto; // Affiche 64.1
$toto -= 56.6; echo $toto; // Affiche 7.5
$toto -= 7.5; echo $toto; // Affiche -7.105427357601E-15
$toto = round($toto,2); echo $toto; // Affiche -0
$toto = round($toto,2); echo $toto; // Affiche enfin 0
Comme vous vous en doutez, il s'agit de prix que j'additionne puis que je soustrait, selon que les articles sont ajoutés ou retirés. Le hic est que le codage binaire des nombres fait apparaître un défaut d'affichage, lorsque le total revient à 0. J'ai bien trouvé la solution écrite ci-dessus, en appliquant 2 fois round (bizarre que la première fois il ne supprime pas le signe!), ou en arrondissant la valeur absolue du total, pour éviter de faire 2 arrondis pour rien, mais j'aimerais savoir s'il existe une meilleure solution.

Merci d'avance!
ChriGoLioNaDor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2010, 07h38   #2
Rédacteur/Modérateur
 
Avatar de MaitrePylos
 
Homme Gérard Ernaelsten
DBA & Dev PHP
Inscription : juin 2005
Messages : 3 165
Détails du profil
Informations personnelles :
Nom : Homme Gérard Ernaelsten
Âge : 39
Localisation : Belgique

Informations professionnelles :
Activité : DBA & Dev PHP
Secteur : Service public

Informations forums :
Inscription : juin 2005
Messages : 3 165
Points : 6 446
Points : 6 446
Bonjour,

Il faut travailler avec des fonctions de plus grande précision "BC MATH" .

Code :
1
2
3
4
5
6
7
8
9
 
(float)$val1 =56.6;
(float)$val2 = 7.5; 
 
bcscale(3); //donne une précision de trois chiffres après la virgule
$toto = bcadd($val1,$val2); echo $toto.'<br />'; // Affiche 64.100
$toto = bcsub($toto,$val1); echo $toto.'<br />'; // Affiche 7.500
$toto = bcsub($toto,$val2); echo $toto.'<br />'; // Affiche 0.000
$toto = round($toto,2); echo $toto.'<br />'; // Affiche 0
MaitrePylos est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2010, 09h25   #3
Expert Confirmé
 
Avatar de Séb.
 
Inscription : mars 2005
Messages : 2 814
Détails du profil
Informations personnelles :
Âge : 34
Localisation : France

Informations professionnelles :
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mars 2005
Messages : 2 814
Points : 3 436
Points : 3 436
Citation:
selon que les articles sont ajoutés ou retirés
Tu peux surement t'y prendre différemment sans jamais de soustraction.
__________________
Un problème exposé clairement est déjà à moitié résolu
Keep It Smart and Simple
Séb. est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/11/2010, 15h19   #4
Membre du Club
 
Inscription : août 2005
Messages : 171
Détails du profil
Informations forums :
Inscription : août 2005
Messages : 171
Points : 40
Points : 40
Merci de vos réponses.

En effet à partir du moment où j'ai les infos de chaque article, je pourrais recalculer le total à chaque fois. Mais comme j'affiche le total sur chaque page, c'est un peu dommage de calculer la même chose à chaque fois qu'une page est chargée

Et concernant BC Math, il n'est pas activé sur mon serveur. ^^
ChriGoLioNaDor est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h45.


 
 
 
 
Partenaires

Hébergement Web