Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Bug ASP/VBScript??

11 réponses
Avatar
Francis Spiesser
Salut à tous,

Je viens de tomber sur un cas des plus étranges...
Que donne chez vous le code :

<%
Dim nPrix

nPrix=19.90

Response.Write (nPrix*100)
Response.Write(" != ")
Response.Write(Int(nPrix*100))
%>

Moi j'ai "1990 != 1989" ! Etonnant, non ?
Ca "marche" aussi avec 19.24 qui donne 1924 != 1923

Ca me fait pareil avec Fix au lieu de Int, avec 100.00 au lieu de 100.
Le seul moyen que j'ai trouvé, c'est de faire :

Response.Write (nPrix*100)
Response.Write(" = ")
Response.Write(Int((nPrix+0.001)*100)), histoire que le Int aie quelque
chose à "INTer"... Mais c'est quand même dingue (et très inquiétant !)

Problème constaté sur Windows XP et sur Windows server 2003...

Et vous ?


FU2 microsoft.public.fr.scripting

--

------------------------------
Francis
(remplacer .nospam par .net dans mon adresse pour me répondre
directement)

"Quand tout baigne, il y a forcément quelque chose qui va couler"

10 réponses

1 2
Avatar
Georges MAUREL
Bonjour Francis,
J'ai testé ton script et effectivement j'ai le même résultat que toi sous
w2000 pro
Par contre si on remplace le Int(nPrix*100) par CInt(nPrix*100) on a les
bonnes valeurs

Cordialement
Georges

"Francis Spiesser" a écrit dans le
message de news:
Salut à tous,

Je viens de tomber sur un cas des plus étranges...
Que donne chez vous le code :

<%
Dim nPrix

nPrix.90

Response.Write (nPrix*100)
Response.Write(" != ")
Response.Write(Int(nPrix*100))
%>

Moi j'ai "1990 != 1989" ! Etonnant, non ?
Ca "marche" aussi avec 19.24 qui donne 1924 != 1923

Ca me fait pareil avec Fix au lieu de Int, avec 100.00 au lieu de 100.
Le seul moyen que j'ai trouvé, c'est de faire :

Response.Write (nPrix*100)
Response.Write(" = ")
Response.Write(Int((nPrix+0.001)*100)), histoire que le Int aie quelque
chose à "INTer"... Mais c'est quand même dingue (et très inquiétant !)

Problème constaté sur Windows XP et sur Windows server 2003...

Et vous ?


FU2 microsoft.public.fr.scripting

--

------------------------------
Francis
(remplacer .nospam par .net dans mon adresse pour me répondre
directement)

"Quand tout baigne, il y a forcément quelque chose qui va couler"



Avatar
Georges MAUREL
Re bonjour Francis,
une autre solution est de faire : int(round(nPrix*100,2))
et cela donnera le bon résultat

Cordialement
Georges

"Francis Spiesser" a écrit dans le
message de news:
Salut à tous,

Je viens de tomber sur un cas des plus étranges...
Que donne chez vous le code :

<%
Dim nPrix

nPrix.90

Response.Write (nPrix*100)
Response.Write(" != ")
Response.Write(Int(nPrix*100))
%>

Moi j'ai "1990 != 1989" ! Etonnant, non ?
Ca "marche" aussi avec 19.24 qui donne 1924 != 1923

Ca me fait pareil avec Fix au lieu de Int, avec 100.00 au lieu de 100.
Le seul moyen que j'ai trouvé, c'est de faire :

Response.Write (nPrix*100)
Response.Write(" = ")
Response.Write(Int((nPrix+0.001)*100)), histoire que le Int aie quelque
chose à "INTer"... Mais c'est quand même dingue (et très inquiétant !)

Problème constaté sur Windows XP et sur Windows server 2003...

Et vous ?


FU2 microsoft.public.fr.scripting

--

------------------------------
Francis
(remplacer .nospam par .net dans mon adresse pour me répondre
directement)

"Quand tout baigne, il y a forcément quelque chose qui va couler"



Avatar
Francis Spiesser
Georges MAUREL a exposé le 04/11/2004 :
Re bonjour Francis,
une autre solution est de faire : int(round(nPrix*100,2))
et cela donnera le bon résultat



Merci de l'astuce, elle est un moins "sale" que la mienne.

Quant au CInt, c'est bizarre que ça fonctionne puisque lui est censé
arrondir (enfin quand il ya quelque chose à arrondir, bien sûr...)

bye

--

------------------------------
Francis
(remplacer .nospam par .net dans mon adresse pour me répondre
directement)

"Quand tout baigne, il y a forcément quelque chose qui va couler"

Avatar
Jean
Bonjour,

La réponse est dans la documentation : http://download.microsoft.com/download/winscript56/install/5.6/w98nt42kme/fr/scd56fr.exe

Fonctions Int, Fix
http://msdn.microsoft.com/library/en-us/script56/html/vsfctInt.asp

"Les deux fonctions Int et Fix suppriment la partie fractionnaire de l'argument number et renvoie la valeur entière résultante."

"La différence entre les fonctions Int et Fix tient au fait que si l'argument number est négatif, la fonction Int renvoie le premier
entier négatif inférieur ou égal à number, tandis que la fonction Fix renvoie le premier entier négatif supérieur ou égal à number."

Fonction CInt
http://msdn.microsoft.com/library/en-us/script56/html/vsfctCInt.asp

"Remarque La fonction CInt est différente des fonctions Fix et Int qui tronquent au lieu d'arrondir la mantisse d'un nombre.
Quand la mantisse est exactement 0,5, la fonction CInt l'arrondit toujours au nombre pair le plus proche. Par exemple, 0,5 est
arrondi à 0 et 1,5 est arrondi à 2."

Amicalement,

Jean - JMST
Belgium

"Francis Spiesser" a écrit dans le message de news:

Georges MAUREL a exposé le 04/11/2004 :
Re bonjour Francis,
une autre solution est de faire : int(round(nPrix*100,2))
et cela donnera le bon résultat



Merci de l'astuce, elle est un moins "sale" que la mienne.

Quant au CInt, c'est bizarre que ça fonctionne puisque lui est censé arrondir (enfin quand il ya quelque chose à arrondir, bien
sûr...)

bye

--

------------------------------
Francis
(remplacer .nospam par .net dans mon adresse pour me répondre directement)

"Quand tout baigne, il y a forcément quelque chose qui va couler"




Avatar
Francis Spiesser
Jean a exposé le 05/11/2004 :
Bonjour,

La réponse est dans la documentation :


Oui, c'est tout à fait ce que je voulais dire par "CInt est censé
arrondir", mais merci pour l'extrême précision de la réponse.

En ce qui concerne le bug initial, voici la réponse qui m'a été donnée
sur un autre forum et qui explique dans quelles conditions, il peut
survenir. Merci à El Papyo pour sa recherche.
---------------
C'est un probleme connu sur toutes les implémentations de windows, du
aux limites de la représentation interne des floats (dans ce cas dans
le variant) à la norme IEEE, intrinseque aux langages microsoft/à
windows :
http://support.microsoft.com/default.aspx?scid=kb;en-us;36068
http://support.microsoft.com/default.aspx?scid=kb;en-us;145889

19.90 *100 => ne donne pas 1990 mais une représentation float IEEE qui
pourrait être au pif 1989.955353545135...
Si tu lances INT sur une représentation interne de ce type...
---------------

--

------------------------------
Francis
(remplacer .nospam par .net dans mon adresse pour me répondre
directement)

"Quand tout baigne, il y a forcément quelque chose qui va couler"

Avatar
Sylvain F
et avec un Cint ?

"Francis Spiesser" a écrit dans le
message de news:
Salut à tous,

Je viens de tomber sur un cas des plus étranges...
Que donne chez vous le code :

<%
Dim nPrix

nPrix.90

Response.Write (nPrix*100)
Response.Write(" != ")
Response.Write(Int(nPrix*100))
%>

Moi j'ai "1990 != 1989" ! Etonnant, non ?
Ca "marche" aussi avec 19.24 qui donne 1924 != 1923

Ca me fait pareil avec Fix au lieu de Int, avec 100.00 au lieu de 100.
Le seul moyen que j'ai trouvé, c'est de faire :

Response.Write (nPrix*100)
Response.Write(" = ")
Response.Write(Int((nPrix+0.001)*100)), histoire que le Int aie quelque
chose à "INTer"... Mais c'est quand même dingue (et très inquiétant !)

Problème constaté sur Windows XP et sur Windows server 2003...

Et vous ?


FU2 microsoft.public.fr.scripting

--

------------------------------
Francis
(remplacer .nospam par .net dans mon adresse pour me répondre
directement)

"Quand tout baigne, il y a forcément quelque chose qui va couler"



Avatar
Axel Guerrier [MS]
Bonjour Francis,

Pour moi (et d'autres), ce n'est pas un bug, mais juste la manière de
calculer pour un ordinateur... (qui n'a que des 0 et des 1 à sa disposition
:-))

196652 How To Implement Custom Rounding Procedures
http://support.microsoft.com/?id6652


--
Axel Guerrier
Microsoft France
--------------------
Merci de bien vouloir répondre à ce message dans le newsgroup où il a été
posté. Je le consulte régulièrement.

"Francis Spiesser" wrote in message
news:
Salut à tous,

Je viens de tomber sur un cas des plus étranges...
Que donne chez vous le code :

<%
Dim nPrix

nPrix.90

Response.Write (nPrix*100)
Response.Write(" != ")
Response.Write(Int(nPrix*100))
%>

Moi j'ai "1990 != 1989" ! Etonnant, non ?
Ca "marche" aussi avec 19.24 qui donne 1924 != 1923

Ca me fait pareil avec Fix au lieu de Int, avec 100.00 au lieu de 100. Le
seul moyen que j'ai trouvé, c'est de faire :

Response.Write (nPrix*100)
Response.Write(" = ")
Response.Write(Int((nPrix+0.001)*100)), histoire que le Int aie quelque
chose à "INTer"... Mais c'est quand même dingue (et très inquiétant !)

Problème constaté sur Windows XP et sur Windows server 2003...

Et vous ?


FU2 microsoft.public.fr.scripting

--

------------------------------
Francis
(remplacer .nospam par .net dans mon adresse pour me répondre directement)

"Quand tout baigne, il y a forcément quelque chose qui va couler"



Avatar
JPMagnal
Effectivement ne pas indiquer dès le départ que les calculs se feront
sur des valeurs entières, mais utiliser Cint qui convertit le résultat
du calcul réel en valeur entière.

Bonjour Francis,
J'ai testé ton script et effectivement j'ai le même résultat que toi sous
w2000 pro
Par contre si on remplace le Int(nPrix*100) par CInt(nPrix*100) on a les
bonnes valeurs

Cordialement
Georges

"Francis Spiesser" a écrit dans le
message de news:

Salut à tous,

Je viens de tomber sur un cas des plus étranges...
Que donne chez vous le code :

<%
Dim nPrix

nPrix.90

Response.Write (nPrix*100)
Response.Write(" != ")
Response.Write(Int(nPrix*100))
%>

Moi j'ai "1990 != 1989" ! Etonnant, non ?
Ca "marche" aussi avec 19.24 qui donne 1924 != 1923

Ca me fait pareil avec Fix au lieu de Int, avec 100.00 au lieu de 100.
Le seul moyen que j'ai trouvé, c'est de faire :

Response.Write (nPrix*100)
Response.Write(" = ")
Response.Write(Int((nPrix+0.001)*100)), histoire que le Int aie quelque
chose à "INTer"... Mais c'est quand même dingue (et très inquiétant !)

Problème constaté sur Windows XP et sur Windows server 2003...

Et vous ?


FU2 microsoft.public.fr.scripting

--

------------------------------
Francis
(remplacer .nospam par .net dans mon adresse pour me répondre
directement)

"Quand tout baigne, il y a forcément quelque chose qui va couler"








Avatar
Sylvain
Bonjour,

Essayez avec un Cint

<%
Dim nPrix

nPrix.90

Response.Write (nPrix*100)
Response.Write(" != ")
Response.Write(CInt(nPrix*100))
%>



"Francis Spiesser" a écrit dans le
message de news:
Salut à tous,

Je viens de tomber sur un cas des plus étranges...
Que donne chez vous le code :

<%
Dim nPrix

nPrix.90

Response.Write (nPrix*100)
Response.Write(" != ")
Response.Write(Int(nPrix*100))
%>

Moi j'ai "1990 != 1989" ! Etonnant, non ?
Ca "marche" aussi avec 19.24 qui donne 1924 != 1923

Ca me fait pareil avec Fix au lieu de Int, avec 100.00 au lieu de 100.
Le seul moyen que j'ai trouvé, c'est de faire :

Response.Write (nPrix*100)
Response.Write(" = ")
Response.Write(Int((nPrix+0.001)*100)), histoire que le Int aie quelque
chose à "INTer"... Mais c'est quand même dingue (et très inquiétant !)

Problème constaté sur Windows XP et sur Windows server 2003...

Et vous ?


FU2 microsoft.public.fr.scripting

--

------------------------------
Francis
(remplacer .nospam par .net dans mon adresse pour me répondre
directement)

"Quand tout baigne, il y a forcément quelque chose qui va couler"



Avatar
Francis Spiesser
Bonjour Francis,

Pour moi (et d'autres), ce n'est pas un bug, mais juste la manière de
calculer pour un ordinateur... (qui n'a que des 0 et des 1 à sa disposition
:-))

196652 How To Implement Custom Rounding Procedures
http://support.microsoft.com/?id6652




Merci pour le lien mais, langue de bois mise à part, de telles erreurs
sur des opérations aussi basiques si ça n'est pas un bug, c'est un
grave problème dans l'architecture du produit/système/processeur (rayez
les mentions inutiles).
J'ai fait des tests avec Visual FoxPro et je n'arrive pas à reproduire
ce problème... Curieux, non ?

--

------------------------------
Francis
(remplacer .nospam par .net dans mon adresse pour me répondre
directement)

"Quand tout baigne, il y a forcément quelque chose qui va couler"

1 2