Drôle d'arrondi ...

Le
Jérémie
Bonjour à tous,

J'ai remarqué un "problème" d'arrondi sous JS : je calcule un ratio avec des
flottants, mais l'arrondi fausse mes résultats, par exemple :

var plage1 = 4.30;
var plage2 = 0.30;

var nbHeures = plage1 + plage2; // Donne 4.59 et pas 5.0 !
var nbTaches = 48.00;

var ratio = nbTaches / nbHeures; // Renvoie 10.46 au lieu de 9.6

Je précise que les plages d'heures sont calculées via une fonction faisant
appel à des modulos (voir sujet "Additionner des heures", merci Olivier!).

Verriez-vous comment contourner ce problème ? J'ai essayé var nbHeures =
parseFloat(plage1 + plage2 + 0.01), mais le résultat reste le même.
Il me semble que PHP apporte le même problème :

(int) 8.0 => 7 car PHP stocke en interne 8.0 comme 7.99999..9.

Merci de votre coup de main.

Jérémie
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Olivier Miakinen
Le #758982

J'ai remarqué un "problème" d'arrondi sous JS : je calcule un ratio avec des
flottants, mais l'arrondi fausse mes résultats,


C'est classique avec les flottants.

par exemple :

var plage1 = 4.30;
var plage2 = 0.30;

var nbHeures = plage1 + plage2; // Donne 4.59 et pas 5.0 !


De toute façon, ça ne peut pas donner 5.0. Utiliser des flottants pour
représenter les heures me semble assez farfelu...

Tu peux utiliser deux entiers :
var heuresPlage1 = 4;
var minutesPlage1 = 30;

Ou alors tout stocker en minutes :
var plage1 = 270;

Mais tu peux aussi créer une classe pour ça.

Je précise que les plages d'heures sont calculées via une fonction faisant
appel à des modulos (voir sujet "Additionner des heures", merci Olivier!).


Ah, c'était déjà toi ? ;-)
Là je vois que tu veux non seulement additionner des heures mais aussi
les diviser. Pour faire ça, note que 4 h 30 mn ça fait 4,5 h et pas
4,3 h !

Verriez-vous comment contourner ce problème ?


1) N'utiliser que des entiers pour des calculs exacts.
2) Faire heureFloat = heureInt + (minInt / 60) pour les divisions.

Jérémie
Le #758981
Pourrait-on alors envisager un test du genre :
si partie Minutes Y alors
// passer à l'heure arrondie suivante
fin_si
"Olivier Miakinen" 462884d2$

J'ai remarqué un "problème" d'arrondi sous JS : je calcule un ratio avec
des
flottants, mais l'arrondi fausse mes résultats,


C'est classique avec les flottants.

par exemple :

var plage1 = 4.30;
var plage2 = 0.30;

var nbHeures = plage1 + plage2; // Donne 4.59 et pas 5.0 !


De toute façon, ça ne peut pas donner 5.0. Utiliser des flottants pour
représenter les heures me semble assez farfelu...

Tu peux utiliser deux entiers :
var heuresPlage1 = 4;
var minutesPlage1 = 30;

Ou alors tout stocker en minutes :
var plage1 = 270;

Mais tu peux aussi créer une classe pour ça.

Je précise que les plages d'heures sont calculées via une fonction
faisant
appel à des modulos (voir sujet "Additionner des heures", merci
Olivier!).


Ah, c'était déjà toi ? ;-)
Là je vois que tu veux non seulement additionner des heures mais aussi
les diviser. Pour faire ça, note que 4 h 30 mn ça fait 4,5 h et pas
4,3 h !

Verriez-vous comment contourner ce problème ?


1) N'utiliser que des entiers pour des calculs exacts.
2) Faire heureFloat = heureInt + (minInt / 60) pour les divisions.



Olivier Miakinen
Le #758979
Pourrait-on alors envisager un test du genre :
si partie Minutes Y alors
// passer à l'heure arrondie suivante
fin_si


Oui, tu peux toujours envisager de rajouter des bidouilles dans un code
mal fichu pour colmater les fuites d'un côté, mais alors ça a toutes les
chances de fuir de l'autre.

Mais il vaudrait quand même mieux écrire directement un code simple et
sans surprises.

"Olivier Miakinen" 462884d2$
[ citation intégrale ]



Tu peux aussi apprendre à citer efficacement :
:-p


Jérémie
Le #758656
Pourrait-on alors envisager un test du genre :
si partie Minutes Y alors
// passer à l'heure arrondie suivante
fin_si


Oui, tu peux toujours envisager de rajouter des bidouilles dans un code
mal fichu pour colmater les fuites d'un côté, mais alors ça a toutes les
chances de fuir de l'autre.

Mais il vaudrait quand même mieux écrire directement un code simple et
sans surprises.

"Olivier Miakinen" 462884d2$
[ citation intégrale ]



Tu peux aussi apprendre à citer efficacement :
:-p


Je viens de penser à un truc, merci de ton avis :

Convertir les flottants en minutes (donc en entiers) avant de les
additionner. Multiplier ensuite le nombre de tâches par 60 (histoire de
garder les mêmes échelles , puis effectuer le calcul du ratio
(nbActes/NbMinutes).

Jérémie



Jérémie
Le #739867
Attends, je viens de remarquer un truc bizarre.. Ce décalage se produit à un
endroit bien spécifique, en retranchant une minute, quels soient les minutes
additionnées, par exemple, 0.23 + 0.23 = 0.45, jamais 0.46, et à un autre
endroit, ce sont carrément deux minutes qui sautent ... Firebug, viens à mon
aide !
"Olivier Miakinen" 46288e06$
Pourrait-on alors envisager un test du genre :
si partie Minutes Y alors
// passer à l'heure arrondie suivante
fin_si


Oui, tu peux toujours envisager de rajouter des bidouilles dans un code
mal fichu pour colmater les fuites d'un côté, mais alors ça a toutes les
chances de fuir de l'autre.

Mais il vaudrait quand même mieux écrire directement un code simple et
sans surprises.

"Olivier Miakinen" news:
462884d2$
[ citation intégrale ]



Tu peux aussi apprendre à citer efficacement :
:-p




Olivier Miakinen
Le #739606
Attends, je viens de remarquer un truc bizarre.. Ce décalage se produit à un
endroit bien spécifique, en retranchant une minute, quels soient les minutes
additionnées, par exemple, 0.23 + 0.23 = 0.45, jamais 0.46, et à un autre
endroit, ce sont carrément deux minutes qui sautent ...


Tandis que si tu additionnais des entiers tu aurais *toujours* le bon
résultat (sauf à frôler les millions de milliards de minutes, bien sûr).

Ainsi, 23 + 23 = 46, pas 45.

"Olivier Miakinen" 46288e06$
[ citation intégrale, y compris :
]



De toute façon je vois bien que tu te fiches de ce que je peux te
répondre, puisque tu continues à citer l'intégralité de ce à quoi tu
réponds (ou ne réponds pas, d'ailleurs), qui plus est à l'envers.

La prochaine fois, ton article va à la poubelle tout de suite.

Voir :
--
Olivier Miakinen

Halte à la porcinographie :


Jérémie
Le #739605
Contournement possible trouvé, testé et approuvée :

rajout de 0.001, avec les Math.floor() disposés dans la fonction
précedemment donnée pour l'addition des minutes, on retombe toujours sur le
bon résultat.

"Olivier Miakinen" 462cb419$
Attends, je viens de remarquer un truc bizarre.. Ce décalage se produit à
un
endroit bien spécifique, en retranchant une minute, quels soient les
minutes
additionnées, par exemple, 0.23 + 0.23 = 0.45, jamais 0.46, et à un autre
endroit, ce sont carrément deux minutes qui sautent ...


Tandis que si tu additionnais des entiers tu aurais *toujours* le bon
résultat (sauf à frôler les millions de milliards de minutes, bien sûr).

Ainsi, 23 + 23 = 46, pas 45.

"Olivier Miakinen" news:
46288e06$
[ citation intégrale, y compris :
]



De toute façon je vois bien que tu te fiches de ce que je peux te
répondre, puisque tu continues à citer l'intégralité de ce à quoi tu
réponds (ou ne réponds pas, d'ailleurs), qui plus est à l'envers.

La prochaine fois, ton article va à la poubelle tout de suite.

Voir :
--
Olivier Miakinen

Halte à la porcinographie :




Olivier Miakinen
Le #739604

[ citation intégrale, dont :
La prochaine fois, ton article va à la poubelle tout de suite.
Voir : ]



Donc, plonk.


Jérémie
Le #739598
tel forum veut ci, , tel autre exige ça, mettez-vous d'accord les mecs !

[ citation intégrale, dont :
La prochaine fois, ton article va à la poubelle tout de suite.
Voir : ]



Donc, plonk.




loiseauthierry
Le #739597
Jérémie
tel forum veut ci, , tel autre exige ça, mettez-vous d'accord les mecs !


La remarque porte sur la façon de poster sur Usenet-FR.
Et Olivier a donné un lien qui permet de comprendre comment s'y prendre.


Et cette manière, elle est valable pour *tous* les groupes.

Merci de prendre le temps de lire...

Thierry
--
* * __*__ *
* * * -----oOOo---°O°---oOOo------ * *
* * -------- oOOo oOOo -------- *

Publicité
Poster une réponse
Anonyme