PHP... Soustraction étrange !

  • Auteur de la discussion Auteur de la discussion Grantome
  • Date de début Date de début
G
Grantome
Guest
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 ?
 
H
Haq
Guest
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.
 
H
Haq
Guest
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...
 
H
Haq
Guest
Grantome a dit:
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.
 
WRInaute occasionnel
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...
 
WRInaute passionné
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
 
WRInaute impliqué
en conclusion : passe tout en entier (prend la milliseconde comme référence et non la seconde) ;-)
 
G
Grantome
Guest
yanhl a dit:
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
 
WRInaute impliqué
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:
 

➡️ Offre MyRankingMetrics ⬅️

pré-audit SEO gratuit avec RM Tech (+ avis d'expert)
coaching offert aux clients (avec Olivier Duffez ou Fabien Faceries)

Voir les détails ici

coaching SEO
Discussions similaires
Haut