Bug DotNet

jjDai Messages postés 291 Date d'inscription vendredi 21 février 2003 Statut Membre Dernière intervention 13 mars 2015 - 26 févr. 2006 à 01:40
cs_dugh Messages postés 9 Date d'inscription lundi 14 avril 2003 Statut Membre Dernière intervention 23 juillet 2009 - 2 mars 2007 à 12:01
Le peti bout de code qui suit me donne des résultats étonnant:
'////////////////////////////////////////////////////////////////////////////////


Private
Sub testTronquer()



Dim h
As
Integer



For h = 1
To 15
Step 2


Tronquer(h, 2)



Next



End
Sub



Private
Sub Tronquer(
ByVal d1
As
Double,
ByVal Diviseur
As
Integer)



Dim d2
As
Double, d3
As
Double



Dim i
As
Integer, j
As
Integer


d2 = d1 / Diviseur


d3 = Math.Ceiling(d2)


i =
CInt(d2)


j =
CType(d1 / 2,
Integer)


Debug.WriteLine(d1 & "/2 " & d3 & " " & "i = " & i & " === " & j)



End
Sub

'/////////////////////////////////////////////////////////////
En sortie ça me donne

1/2 1 i = 0 === 0


3/2 2 i = 2 === 2


5/2 3 i = 2 === 2


7/2 4 i = 4 === 4


9/2 5 i = 4 === 4


11/2 6 i = 6 === 6


13/2 7 i = 6 === 6


15/2 8 i = 8 === 8

autant dire que la fonction Ceilling ne fait pas tout à fait ce qu'on attend d'elle, elle ne tronque pas à la valeur la plus proche de zéro.
Qualqu'un aurait il une solution ?

JJDai

6 réponses

Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
26 févr. 2006 à 02:50
Salut,

désolé il n'y a pas de fonction Ceil en VB6

il me semble pourtant qu'une fonction Ceil renvoit l'entier supérieur ou égal

Ceil(0.5) --> 1


Ceil(7.5) --> 8





d'autre part Cint() arrondi de façon spécial pour le cas limite n.5

suivant que le dernier chiffre n est pair ou impair:

0.5 = 0

1.5 = 2

2.5 = 2

3.5 = 4

4.5 = 4

5.5 = 6

6.5 = 6

7.5 = 8

8.5 = 8

9.5 = 10



donc:

Cint(13/2) --> 6.5 --> 6

Cint(15/2) --> 7.5 --> 8


Daniel
0
jjDai Messages postés 291 Date d'inscription vendredi 21 février 2003 Statut Membre Dernière intervention 13 mars 2015
26 févr. 2006 à 09:13
Effectivement, et jusque la je m'en était accomodé, mais la je suis surn algo un peu complexe, et cette anomalie m'a fais perdre pas mal de temps pour la détecter. du coup j'utilise une fonction qui passe pas un trastypage en chainede caractere et de nouveau en entier, mais bonjour les performances.
'------------------------------------------------------


Function Tronquer(
ByVal n
As
Integer,
ByVal diviseur
As
Integer)
As
Integer



Dim d
As
Double



Dim i
As
Integer



Dim s
As
String


s = (n / 2).ToString


i = InStr(s, ".")



If i > 0
Then


s = s.Substring(0, i - 1)



End
If


n =
CType(s,
Integer)



Return n



End
Function

'--------------------------------------------------------------------------------

JJDai
0
jjDai Messages postés 291 Date d'inscription vendredi 21 février 2003 Statut Membre Dernière intervention 13 mars 2015
26 févr. 2006 à 10:07
Pour info c'est pareil en c#


//----------------------------------------------------------------
private
void testTronquer()
{

for (
int i = 1; i <= 5; i++)
Console.WriteLine(i);
for (
int h = 1; h <=15 ; h++)
{
Tronquer( (
double)h, 2);
}
}

//-----------------------------------------------------------------
private
void Tronquer(
double d1 ,
int Diviseur )
{

double d2, d3 ;

int i , j ;
d2 = d1 / Diviseur;
d3 = Math.Ceiling(d2);
i = (
int)(d2);j = (
int)(d1 / 2); Console.WriteLine (d1 + "/2 " + d3 + " " + "i = " + i + " === " + j);
}

//----------------------------------------------------------------

donne, eh bin pareil:


1/2 1 i = 0 === 02/2 1 i = 1 === 13/2 2 i = 1 === 14/2 2 i = 2 === 25/2 3 i = 2 === 26/2 3 i = 3 === 37/2 4 i = 3 === 38/2 4 i = 4 === 49/2 5 i = 4 === 410/2 5 i = 5 === 511/2 6 i = 5 === 512/2 6 i = 6 === 613/2 7 i = 6 === 614/2 7 i = 7 === 715/2 8 i = 7 === 7

Don ne vous fiez pas à la méthode <Ceiling>

JJDai
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
26 févr. 2006 à 12:09
pas très bien compris.

les résultats sont parfaitement en accord à la méthode <Ceiling>

valeur supérieur ou égale:

Ceil(5.00001) --> 6

Ceil(5) ---------> 5



j'ai l'impression que tu confond Ceil() avec une autre fonction:

arrondi à la valeur inférieur ("la valeur la plus proche de zéro")

ce qui serait bien c'est que tu dise quels sont les résultats que tu voudrais avoir:

1/2 ==> 0

2/2 ==> 1

3/2 ==> 1

4/2 ==> 2

5/2 ==> 2

6/2 ==> 3

7/2 ==> 3

8/2 ==> 4


je ne pratique pas .net, mais tu dois surement avoir une fonction qui le fait:

Math.Floor(d2) ou Math.Round(d2,0) ou Int(d2)

Daniel
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jjDai Messages postés 291 Date d'inscription vendredi 21 février 2003 Statut Membre Dernière intervention 13 mars 2015
26 févr. 2006 à 19:46
yes au temps pour moi, mais l'aide en ligne n'est pas très explicite et effectivement il y a une function Floor. j'ai donc pris l'une pour l'autre.

Merci pour ces suggestions, en fait c'est Floor dont j'avais besoin.
J'ai un peu de mal à m'adapter à la terminologie de dotNet. Encore 10 ans de pratique et ce sera bon.
encore merci.

JJDai
0
cs_dugh Messages postés 9 Date d'inscription lundi 14 avril 2003 Statut Membre Dernière intervention 23 juillet 2009
2 mars 2007 à 12:01
Voici un petit bout de code permettant de faire le ceil sous vb6:

Public Function ceil(nb As Double) As Long
    If CInt(nb) = nb Then
        ceil = nb
    Else
        ceil = Int(nb) + 1
    End If
End Function

Résultats:
-0.1 => 0
-0.5 => 0
-0.8 => 0
-1   => -1
-1.1 => -1
-1.4 => -1


0   => 0
0.1 => 1
0.5 => 1
0.8 => 1
1   => 1
1.1 => 2
1.4 => 2
1.5 => 2
1.6 => 2
1.8 => 2
2   => 2
2.1 => 3
2.4 => 3
2.5 => 3
2.6 => 3
2.8 => 3


si ca peut vous servir...

go gO GO !!
0
Rejoignez-nous