PHP... Soustraction étrange !

Consultez la formation à Google Analytics de WebRankInfo / Ranking Metrics

Grantome
WRInaute accro
WRInaute accro
 
Messages: 2899
Inscription: 16 Jan 2004

PHP... Soustraction étrange !

Message le Dim Jan 23, 2005 10:47

Salut,

Voici exacement ce que je fais... Y a pas plus simple. (Je crois)

J'ai un tableau de temps avec ce type de valeur 1'20''235, par exemple.

Je souhaite touver l'écart entre 2 temps, par exemple 1'20''235 et 1'22''871

Fonction explode pour avoir "1", "20" et "235" pour le premier et "1", "22" et "871" pour le second.

Je multiplie par 60 le premier chiffre (minutes, ramenées en seconde)
Je laisse tel quel le second chiffre
Je /1000 le troisième (pour avoir les millième en seconde)

Résultat, j'ai $a = 80.235 et $b = 82.871

ensuite, $c = $b - $a... qui donne 2.636
Mais, il arrive sur par exemple une 20aine de calcul d'écart que 2 ou trois se trouve de ce type:
1.54799999999 au lieu de 1.548
1.84300000001 au lieu de 1.843


Quelqu'un a un indice ?

Haq
WRInaute passionné
WRInaute passionné
 
Messages: 2104
Inscription: 29 Aoû 2002

Message le Dim Jan 23, 2005 11:08

Un bon petit round() et on n'en parle plus...
Je n'ai pas trouvé (mais pas cherché longtemps non plus) d'explication logique ceci dit.

Haq
WRInaute passionné
WRInaute passionné
 
Messages: 2104
Inscription: 29 Aoû 2002

Message le Dim Jan 23, 2005 11:14

Mais pour savoir ce qui cause ce nombre de décimales, il te suffirait d'afficher $a et $b jusqu'à ce que tu tombes sur un exemple où $c est foireux. Tu devrais vite comprendre ce qui est en cause...

Haq
WRInaute passionné
WRInaute passionné
 
Messages: 2104
Inscription: 29 Aoû 2002

Re: PHP... Soustraction étrange !

Message le Dim Jan 23, 2005 11:21

Grantome a écrit:Je /1000 le troisième (pour avoir les millième en seconde)


Si je comprends bie ce que tu écris, tu divises des millièmes par mille ? Dans ce cas, logique que tu aies des millionnièmes de seconde.

Tu pourrais simplifier tout ça en utilisant les fonctions timestamp() et round() (à moins que tu ne sois contraint d'avoir ton temps sous cette forme, mais rien n'es inéluctable).

Ca prend 3 lignes ce que tu veux faire. Mais si tu ne veux pas changer tout (après tout, ça fonctionne), un $c = round($c,3) arrangera tout.


maxttb
WRInaute occasionnel
WRInaute occasionnel
 
Messages: 477
Inscription: 27 Fév 2004

Message le Dim Jan 23, 2005 12:43

Je ne suis pas sûr que timestamp gère les 1000emes de secondes. Mais comme tu le dis, simplement faire un round règlerais le problème. Reste à savoir si d'autres effets de bords indésirables peuvent découler de ce bug assez étrange...

Haq
WRInaute passionné
WRInaute passionné
 
Messages: 2104
Inscription: 29 Aoû 2002

Message le Dim Jan 23, 2005 12:47

maxttb a écrit:Je ne suis pas sûr que timestamp gère les 1000emes de secondes.


Très juste, par contre microtime() le fait.


moktoipas
WRInaute passionné
WRInaute passionné
 
Messages: 2326
Inscription: 29 Juin 2004

Message le Dim Jan 23, 2005 13:19

Ca me parrait etre tout a fait normal: c'est du a la representation des réel en informatique, la precision n'est pas parfaite et en faisant beaucoup de calcul, l'erreur augmente.
Enfin je suppose que c'est ca , sinon c'est 8O
Je savais que ca existait , mais j'en avais jamais vu :D

yanhl
WRInaute impliqué
WRInaute impliqué
 
Messages: 793
Inscription: 4 Déc 2003

Message le Dim Jan 23, 2005 14:25

en conclusion : passe tout en entier (prend la milliseconde comme référence et non la seconde) ;-)

Grantome
WRInaute accro
WRInaute accro
 
Messages: 2899
Inscription: 16 Jan 2004

Message le Dim Jan 23, 2005 17:50

yanhl a écrit:en conclusion : passe tout en entier (prend la milliseconde comme référence et non la seconde) ;-)


Ouaip, je vais tenter ça...

Sinon, un round()

Merci


MarvinLeRouge
WRInaute impliqué
WRInaute impliqué
 
Messages: 526
Inscription: 1 Sep 2004

Message le Dim Jan 23, 2005 21:00

Citation de la doc php, concernant les nombres à virgule flottante :
Si vous avez besoin d'une précision particulière, reportez-vous au traitement des nombres de grande taille avec les bibliothèques BC ou GMP.


Ce sont des bibliothèques destinées principalement au traitement des grands nombres, mais qui peuvent te servir si tu as besoin d'une précision absolue sur des calculs en virgule flottante, puisqu'ils travaillent en fait avec des entiers :wink:


Si vous avez aimé cette discussion, partagez-la sur vos réseaux sociaux préférés :

Formation recommandée sur ce thème :

Formation Google Analytics : en 2 jours, apprenez comment exploiter l'essentiel des possibilités de l'outil de mesure d'audience de Google. Formation animée par les experts Google Analytics de Ranking Metrics.

Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.

Lectures recommandées sur ce thème :



Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité