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
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).
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
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
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.
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
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
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 ?
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
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
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
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
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
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
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
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.
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.
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.
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
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;
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
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
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
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
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
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
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
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
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.
... 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.