OVH Cloud OVH Cloud

Probleme d'arrondi

18 réponses
Avatar
Laurent Petr
La commande round n'a pas un comportement cohérent sur certains serveur :
round(118.265,2) donne 118.27
et round(215.915,2) donne 215.91

Mais sur un autre serveur j'ai un résultat correct (215.92)...

Comment contourner le problème ?

Laurent

10 réponses

1 2
Avatar
jz
Laurent Petr wrote:
La commande round n'a pas un comportement cohérent sur certains serveur :
round(118.265,2) donne 118.27
et round(215.915,2) donne 215.91

Mais sur un autre serveur j'ai un résultat correct (215.92)...

Comment contourner le problème ?

Laurent


Tiens, c'est inquiétant ça. Je n'ai jamais remarqué ce comportement. Il
faudrait savoir avec quel serveur et quelle version.

Autre méthode : prendre la partie entière de la valeur+0.5 après avoir
multiplié par 100 (si tu veux 2 décimales) puis en redivisant par 100
après (si la valeur est négative il faut enlever les 0.5).

C'est lourd mais ça marche à tous les coups.

Jacques

Avatar
john gallet
La commande round n'a pas un comportement cohérent sur certains serveur :
round(118.265,2) donne 118.27
et round(215.915,2) donne 215.91
Ce qui veut donc dire que dans un cas on a considéré que le radix est .

et dans l'autre que c'est , autremet dit ça sent le setlocale() ou la
configuration de locale différente au niveau système.

Comment contourner le problème ?
Forcer le setlocale à ce qu'on veut permet d'être blindé. Enfin si on y

arrive parce que sur free-bsd dans la version que j'ai, jamais réussit.
Sinon, faire la chasse à l'appel intempestif à cetet fonction. vérifier
la config système si on est sur unix.

a++
JG

Avatar
Franck Guillaud
Laurent Petr wrote:

La commande round n'a pas un comportement cohérent sur certains serveur :
round(118.265,2) donne 118.27
et round(215.915,2) donne 215.91

Mais sur un autre serveur j'ai un résultat correct (215.92)...

Comment contourner le problème ?


Juste comme ça, les deux serveurs ont-ils la même libc ?

Franck,e-


Laurent


Avatar
Stephane Santon
Bonjour,

La commande round n'a pas un comportement cohérent sur certains serveur :
round(118.265,2) donne 118.27
et round(215.915,2) donne 215.91
Mais sur un autre serveur j'ai un résultat correct (215.92)...

Comment contourner le problème ?



Très bonne question.

Tiens, c'est inquiétant ça.


En effet, inquiétant et surprenant.

Autre méthode : prendre la partie entière de la valeur+0.5 après avoir
multiplié par 100 (si tu veux 2 décimales) puis en redivisant par 100
après (si la valeur est négative il faut enlever les 0.5).
C'est lourd mais ça marche à tous les coups.


Euh... je ne crois pas.
Ta formule n'est pas un arrondi, mais un plafond.

--
** Anti-Spam : ajouter [usenet] dans l'objet pour ne pas être rejeté.

Cordialement, Stéphane *** http://www.team-santonum.com
Loisirs, nature, arts, technologie : accueil en Charente-Maritime


Avatar
Stephane Santon
Bonjour,

La commande round n'a pas un comportement cohérent sur certains serveur :
round(118.265,2) donne 118.27
et round(215.915,2) donne 215.91
Ce qui veut donc dire que dans un cas on a considéré que le radix est .

et dans l'autre que c'est , autremet dit ça sent le setlocale() ou la
configuration de locale différente au niveau système.


Euh... Je crois que la réponse est à côté de la plaque là ...
Rien à voir avec . ou , à mon humble avis.

--
** Anti-Spam : ajouter [usenet] dans l'objet pour ne pas être rejeté.

Cordialement, Stéphane *** http://www.team-santonum.com
Loisirs, nature, arts, technologie : accueil en Charente-Maritime


Avatar
Olivier Miakinen

Autre méthode : prendre la partie entière de la valeur+0.5 après avoir
multiplié par 100 (si tu veux 2 décimales) puis en redivisant par 100
après (si la valeur est négative il faut enlever les 0.5).
C'est lourd mais ça marche à tous les coups.


Euh... je ne crois pas.


Si, il a raison. C'est comme ça que l'on fait avec les langages qui
proposent la partie entière mais pas l'arrondi.

Ta formule n'est pas un arrondi, mais un plafond.


Non, pas du tout. Pour avoir le plafond, il faudrait ajouter +1 au lieu
de +0.5, et encore, seulement pour les valeurs non entières.


Avatar
jz
Stephane Santon wrote:
...
Autre méthode : prendre la partie entière de la valeur+0.5 après avoir
multiplié par 100 (si tu veux 2 décimales) puis en redivisant par 100
après (si la valeur est négative il faut enlever les 0.5).
C'est lourd mais ça marche à tous les coups.



Euh... je ne crois pas.
Ta formule n'est pas un arrondi, mais un plafond.



Euh... un plafond... oui, c'est cela... et il est bien bas et tu as du
te cogner dedans, à moins que le ciel ne te soit tombé sur la tête :)

Présenté comme ça :
$valeurarrondie = ((int)($valeur*100+0.5))/100;

Il est où le plafond ?


Jacques


Avatar
Stephane Santon
Bonjour,

Euh... Je crois que la réponse est à côté de la plaque là ...
Rien à voir avec . ou , à mon humble avis.


L'heure des messages que vous voyez ici (18:14) n'a rien à voir avec
l'heure affective d'envoi.
Ces messages dates de nombreux jours.

--
** Anti-Spam : ajouter [usenet] dans l'objet pour ne pas être rejeté.

Cordialement, Stéphane *** http://www.team-santonum.com
Loisirs, nature, arts, technologie : accueil en Charente-Maritime

Avatar
Stephane Santon
Bonjour,

Autre méthode : prendre la partie entière de la valeur+0.5 après avoir
multiplié par 100 (si tu veux 2 décimales) puis en redivisant par 100
après (si la valeur est négative il faut enlever les 0.5).
C'est lourd mais ça marche à tous les coups.


Euh... je ne crois pas.


Si, il a raison. C'est comme ça que l'on fait avec les langages qui
proposent la partie entière mais pas l'arrondi.


C'est ce que j'ai fait aussi durant quelques années de programmation.
Jusqu'à ce que je détecte un jour un comportement bizarre de la fonction
arrondi, et que je découvre en fait un cas particulier de la définition
de la fonction arrondi selon la norme IEEE-754 ou IEC-559 :

L'arrondi d'un nombre dont la partie décimale est 0,5 est l'entier pair
le plus proche.
Donc

1,5 arrondi à 2
2,5 arrondi à 2
3,5 arrondi à 4
4,5 arrondi à 4
...

Comportement assuré par les familles Pentium entre autres.

--
** Anti-Spam : ajouter [usenet] dans l'objet pour ne pas être rejeté.

Cordialement, Stéphane *** http://www.team-santonum.com
Loisirs, nature, arts, technologie : accueil en Charente-Maritime



Avatar
jz
Stephane Santon wrote:
...
C'est ce que j'ai fait aussi durant quelques années de programmation.
Jusqu'à ce que je détecte un jour un comportement bizarre de la fonction
arrondi, et que je découvre en fait un cas particulier de la définition
de la fonction arrondi selon la norme IEEE-754 ou IEC-559 :

L'arrondi d'un nombre dont la partie décimale est 0,5 est l'entier pair
le plus proche.
Donc

1,5 arrondi à 2
2,5 arrondi à 2
3,5 arrondi à 4
4,5 arrondi à 4
...

Comportement assuré par les familles Pentium entre autres.



Tu mélanges vraiment tout.

La norme IEEE-754 définit la représentation binaire de réels. Quand elle
parle d'arrondi, c'est pour le dernier bit de la mantisse lors des
calculs. Cela n'a strictement rien à voir avec ton interprétation
décimale (les ordinateurs n'ont pas 10 doigts pour compter).

Les calculs binaires (au niveau du processeur) se font avec 2 bits
exédentaires afin de limiter les erreurs, et c'est l'arrondi de ces bits
qui est défini par la norme (d'ailleurs elle propose 4 méthodes, mais
basta). Cela peut jouer sur le dernier chiffre significatif (le 15ème
en base 10 avec des réels en double précision), qui de toute façon n'est
pas fiable.

Jacques

1 2