Bonjour

J'ai actuellement un problème avec un traitement manipulant des doubles me renvoyant des résultats erronés.

Je fait pourtant une bête soustraction.

Ma première question est est-ce que la valeur par défaut pour un double est bien 0. Je sais c une question con mais je veux en être sur car la j'en dors plus la nuit de ce problème à la con. Je suis sur que c une merdouille mais j'arrive pas à la voir.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
    Public Sub Calcul()
        Dim locIntCompteurEmploy, locIntCompteurJour As Integer
        Dim locStrMaitriseEmploy As String
        Dim locStrSecteurEmploy As String
        Dim locStrContratEmploy As String
        Dim locDbleTotalInHourAbsEmploy As Double = 0
        Dim locSectResult As secteurResult
        Dim locIntPosSecteur As Integer
        Dim locDateDateJ As Date
        Dim locDateJResult As Calendrier_Jour_Result
        Dim locSemJResult As Calendrier_Semaine_Result
        Dim locMoisJResult As Calendrier_Mois_Result
        Dim locIntPosDateJResult As Integer
        Dim locIntCompteurAbs As Integer
        Dim locIntCompteurPosAbs As Integer
        Dim locIntPosAbs As Integer
        Dim locLgPosDateJCalEmploy As Long
        Dim locIntNumSemaine As Integer
        Dim locStrMoisDeD As String
        Dim locStrAnneDeD As String
        Dim locStrNomMois As String
        Dim locLgPosMoisDateJResult As Long
        Dim locLgPosSemDateJResult As Long
        Dim locDbleTempsPresence As Double = 0
 
        'variable de gestion des informations de jour d'absence
        Dim locStrAbsDate_1 As String = ""
        Dim locStrAbsAbbre_1 As String = ""
        Dim locDbleAbsTotalHour_1 As Double = 0
        Dim locStrAbsDate_2 As String = ""
        Dim locStrAbsAbbre_2 As String = ""
        Dim locDbleAbsTotalHour_2 As Double = 0
 
        Dim locBoolAbsDateCompare As Boolean = False
        Dim locBoolAbsAbbreSubStr As Boolean = False
        Dim locBoolAbsTotalHourCompare As Boolean = False
 
        'variable pour la gestion des temps
        Dim loclgPerfTotalDebut As Long
        Dim loclgPerfTotalFin As Long
        Dim loclgPerfTotalTraitement As Long
 
        'stock la position des absences pour la date du jour de l'employe
        Dim locCollPosAbsDateJ As New System.Collections.Generic.List(Of Integer)
 
        QueryPerformanceCounter(loclgPerfTotalDebut)
 
        For locIntCompteurEmploy = 0 To collInfoEmploy.Count - 1
 
            Console.WriteLine(collInfoEmploy(locIntCompteurEmploy).Ressource & " : ")
            locStrMaitriseEmploy = collInfoEmploy(locIntCompteurEmploy).Maitrise
            Console.WriteLine("     Maitrise : " & collInfoEmploy(locIntCompteurEmploy).Maitrise)
            locStrSecteurEmploy = collInfoEmploy(locIntCompteurEmploy).Secteur
            Console.WriteLine("         Secteur : " & locStrSecteurEmploy)
            locStrContratEmploy = collInfoEmploy(locIntCompteurEmploy).Contrat
            Console.WriteLine("         Contrat : " & locStrContratEmploy)
 
            'si le secteur n'existe pas je la crée
            QueryPerformanceCounter(glDebut)
 
            If SecteurEstDansResult(locStrSecteurEmploy) = False Then
                'utilisation des expressions lambda
                'If Not (collgSecteurResult.Exists(Function(s) s.nomSecteur = locStrSecteurEmploy)) Then
                Console.WriteLine("             Le Secteur : " & locStrSecteurEmploy & " n'existe pas dans la collection de résultat")
                locSectResult = New secteurResult
                locSectResult.nomSecteur = locStrSecteurEmploy
                collgSecteurResult.Add(locSectResult)
                Console.WriteLine("             Le Secteur : " & locStrSecteurEmploy & " est créé dans la collection de résultat")
            Else
                Console.WriteLine("             Le Secteur : " & locStrSecteurEmploy & " existe dans la collection de résultat")
            End If
 
            QueryPerformanceCounter(glFin)
            Console.WriteLine(TempsTrace())
 
            'je récupère la position du secteur
            locIntPosSecteur = PosSecteurResult(locStrSecteurEmploy)
            Console.WriteLine("             le Secteur : " & locStrSecteurEmploy & " est à la position : " & locIntPosSecteur & " dans la collection de résultat")
            'j'ajoute l'employe en cours
            collgSecteurResult(locIntPosSecteur).listeEmploy.Add(collInfoEmploy(locIntCompteurEmploy))
            Console.WriteLine("             Ajout de " & collInfoEmploy(locIntCompteurEmploy).Ressource & " au secteur de résultat :  " & locStrSecteurEmploy)
 
            For locIntCompteurJour = 0 To collDate.Count - 1
                locDateDateJ = collDate(locIntCompteurJour)
                Console.WriteLine(vbCrLf & "              Date du jour : " & locDateDateJ)
                locIntNumSemaine = DatePart("ww", locDateDateJ, vbMonday, FirstWeekOfYear.FirstFourDays).ToString
                Console.WriteLine("                 Numéro de la semaine : " & locIntNumSemaine)
                locStrMoisDeD = MonthName(Month(locDateDateJ))
                locStrAnneDeD = Year(locDateDateJ)
                locStrNomMois = locStrMoisDeD + " " + locStrAnneDeD
                Console.WriteLine("             Mois en cours : " & locStrNomMois & vbCrLf)
 
                QueryPerformanceCounter(glDebut)
 
                'si la date n'existe pas je la crée
                If DateEstDansCalJourResult(locDateDateJ, locIntPosSecteur) = False Then
                    Console.WriteLine("             La date : " & locDateDateJ & " n'existe pas  dans la collection de résultat")
                    locDateJResult = New Calendrier_Jour_Result
                    locDateJResult.dateJ = locDateDateJ
                    collgSecteurResult(locIntPosSecteur).calJourResult.Add(locDateJResult)
                    Console.WriteLine("             La date : " & locDateDateJ & " est crééé dans la collection de résultat")
                Else
                    Console.WriteLine("             La date : " & locDateDateJ & " existe dans la collection de résultat")
                End If
 
                QueryPerformanceCounter(glFin)
 
                Console.WriteLine(TempsTrace())
                QueryPerformanceCounter(glDebut)
 
                'je récupère la position de la date
                locIntPosDateJResult = PosDateCalJourResult(locDateDateJ, locIntPosSecteur)
 
                Console.WriteLine("             la date : " & locDateDateJ & " est à la position : " & locIntPosDateJResult & " dans la collection de résultat" & vbCrLf)
                QueryPerformanceCounter(glFin)
                Console.WriteLine(TempsTrace())
                QueryPerformanceCounter(glDebut)
 
                locLgPosSemDateJResult = SemEstDansCalSemResult(locIntNumSemaine, locIntPosSecteur)
                'si la semaine du jour en cour n'existe pas
                If locLgPosSemDateJResult = -1 Then
                    Console.WriteLine("             La semaine numéro " & locIntNumSemaine & " n'existe pas  dans la collection de résultat")
                    locSemJResult = New Calendrier_Semaine_Result
                    locSemJResult.numSemaine = locIntNumSemaine
                    collgSecteurResult(locIntPosSecteur).calSemResult.Add(locSemJResult)
                    Console.WriteLine("             La semaine numéro " & locIntNumSemaine & " est créée  dans la collection de résultat")
                    locLgPosSemDateJResult = collgSecteurResult(locIntPosSecteur).calSemResult.Count - 1
                Else
                    Console.WriteLine("             La semaine numéro " & locIntNumSemaine & " existe  dans la collection de résultat")
                End If
 
                Console.WriteLine("             La position de la semaine numéro " & locIntNumSemaine & " est : " & locLgPosSemDateJResult & vbCrLf)
                QueryPerformanceCounter(glFin)
                Console.WriteLine(TempsTrace())
                QueryPerformanceCounter(glDebut)
 
                locLgPosMoisDateJResult = MoisEstDansCalMoisResult(locStrNomMois, locIntPosSecteur)
                'si le mois du jour en cour n'existe pas
                If locLgPosMoisDateJResult = -1 Then
                    Console.WriteLine("             Le mois " & locStrNomMois & " n'existe pas  dans la collection de résultat")
                    locMoisJResult = New Calendrier_Mois_Result
                    locMoisJResult.nom_mois_annee = locStrNomMois
                    collgSecteurResult(locIntPosSecteur).calMoisResult.Add(locMoisJResult)
                    Console.WriteLine("             Le mois " & locStrNomMois & " est créée  dans la collection de résultat")
                    locLgPosMoisDateJResult = collgSecteurResult(locIntPosSecteur).calMoisResult.Count - 1
                Else
                    Console.WriteLine("             Le mois " & locStrNomMois & " existe dans la collection de résultat")
                End If
 
                Console.WriteLine("             La position du mois " & locStrNomMois & " est : " & locLgPosMoisDateJResult & vbCrLf)
                QueryPerformanceCounter(glFin)
                Console.WriteLine(TempsTrace())
                QueryPerformanceCounter(glDebut)
 
                If EstJourFerie(locDateDateJ) Then
                    Console.WriteLine("             " & locDateDateJ & " est un jour férié")
                    With collgSecteurResult(locIntPosSecteur).calJourResult(locIntPosDateJResult)
                        .dateJ = locDateDateJ
                        .nbCDI = 0
                        .nbINTER = 0
                    End With
                Else
                    Console.WriteLine("             " & locDateDateJ & " n'est pas un jour férié")
                End If
                QueryPerformanceCounter(glFin)
 
                Console.WriteLine(TempsTrace())
                QueryPerformanceCounter(glDebut)
 
                locLgPosDateJCalEmploy = DateEstDansCalEmploy(locDateDateJ, locIntCompteurEmploy)
 
                If locLgPosDateJCalEmploy <> -1 Then
                    Console.WriteLine("             Est salarié d'Evobus au : " & locDateDateJ)
                    'si la date du jour est dans le calendrier de l'employé => si l'employé est embauché
                    locDbleTempsPresence = collInfoEmploy(locIntCompteurEmploy).collCalEmploy(locLgPosDateJCalEmploy).contracted_time
                    Console.WriteLine("             Temps de travail théorique au " & locDateDateJ & " : " & locDbleTempsPresence)
 
                    'on récupère la liste des absences pour la journée
                    'si la date du jour est inférieure ou égale à la date actuellement lu dans la liste des jours d'absences
                    'on peut sortir de la boucle les dates étant triées par ordre croissant
 
                    Dim locBoolIsDateSup As Boolean = False
 
                    'entre chaque employé il faut pensé à réinitialiser le compteur
                    'pas d'initialisation comme pour la boucle for
                    locIntCompteurAbs = 0
 
                    While ((locIntCompteurAbs <= collInfoEmploy(locIntCompteurEmploy).collCalAbsEmploy.Count - 1) And _
                           (locBoolIsDateSup = False))
                        'date du jour d'absence en cours de lecture
                        Dim locDateTmp As Date = collInfoEmploy(locIntCompteurEmploy).collCalAbsEmploy(locIntCompteurAbs).dateAbsence
                        'si la date du jour en cours est supérieure à la date du jour lu dans la liste des jours d'absences
                        If locDateDateJ >= locDateTmp Then
                            If collInfoEmploy(locIntCompteurEmploy).collCalAbsEmploy(locIntCompteurAbs).dateAbsence = locDateDateJ Then
                                Console.WriteLine("             " & locDateDateJ & " est un jour d'absence")
                                Console.WriteLine("             type d'absence : " & collInfoEmploy(locIntCompteurEmploy).collCalAbsEmploy(locIntCompteurAbs).absTypeAbbr)
                                Console.WriteLine("             durée de l'absence : " & collInfoEmploy(locIntCompteurEmploy).collCalAbsEmploy(locIntCompteurAbs).totalInHour)
                                locCollPosAbsDateJ.Add(locIntCompteurAbs)
                            End If
                            locIntCompteurAbs += 1
                        Else
                            'sinon le jour lu dans la liste des jours d'absences est plus grand que la date du jour
                            'la date du jour d'absence est plus grande que la date du jour pour la recherche on n'a pas besoin 
                            'de continuer la recherche des jours d'absences
                            locBoolIsDateSup = True
                        End If
                    End While
 
                    'For locIntCompteurAbs = 0 To collInfoEmploy(locIntCompteurEmploy).collCalAbsEmploy.Count - 1
                    '    If collInfoEmploy(locIntCompteurEmploy).collCalAbsEmploy(locIntCompteurAbs).dateAbsence = locStrDateJ Then
                    '        Console.WriteLine("             " & locStrDateJ & " est un jour d'absence : ")
                    '        Console.WriteLine("             type d'absence : " & collInfoEmploy(locIntCompteurEmploy).collCalAbsEmploy(locIntCompteurAbs).absTypeAbbr)
                    '        Console.WriteLine("             durée de l'absence : " & collInfoEmploy(locIntCompteurEmploy).collCalAbsEmploy(locIntCompteurAbs).totalInHour)
                    '        locCollPosAbsDateJ.Add(locIntCompteurAbs)
                    '    End If
                    'Next
 
                    'Si il y a plus d'une absence pour la journée
                    If locCollPosAbsDateJ.Count > 1 Then
                        Console.WriteLine("             Il y a plusieurs absences le : " & locDateDateJ)
                        locStrAbsAbbre_1 = ""
                        locStrAbsDate_1 = ""
                        locDbleAbsTotalHour_1 = 0
                        'pour chaque journée d'absence
                        For locIntCompteurPosAbs = 0 To locCollPosAbsDateJ.Count - 1
                            locStrAbsDate_2 = collInfoEmploy(locIntCompteurEmploy).collCalAbsEmploy(locCollPosAbsDateJ(locIntCompteurPosAbs)).dateAbsence
                            locStrAbsAbbre_2 = collInfoEmploy(locIntCompteurEmploy).collCalAbsEmploy(locCollPosAbsDateJ(locIntCompteurPosAbs)).absTypeAbbr
                            locDbleAbsTotalHour_2 = collInfoEmploy(locIntCompteurEmploy).collCalAbsEmploy(locCollPosAbsDateJ(locIntCompteurPosAbs)).totalInHour
                            'on compare les informations de ligne d'absence 2 à 2
                            locBoolAbsDateCompare = dateCompare(locStrAbsDate_1, locStrAbsDate_2)
                            locBoolAbsAbbreSubStr = estSubStr(locStrAbsAbbre_1, locStrAbsAbbre_2)
                            locBoolAbsTotalHourCompare = totalHourCompare(locDbleAbsTotalHour_1, locDbleAbsTotalHour_2)
                            'si les 2 lignes d'informations ne font pas référence à la même absence
                            'il faut soustraire la valeur d'absence
                            If ((locBoolAbsDateCompare And locBoolAbsAbbreSubStr And locBoolAbsTotalHourCompare) = False) Then
                                Console.WriteLine("             Il ne s'agit pas d'absences liées à la même absence")
                                locDbleTempsPresence -= locDbleAbsTotalHour_2
                                Console.WriteLine("             Le temps de présence est de : " & locDbleTempsPresence)
                            Else
                                Console.WriteLine("             Il s'agit d'absences liées à la même absence")
                            End If
                            'on récupère les informations de la lignes en cours pour les comparer à la ligne suivante
                            locStrAbsDate_1 = locStrAbsDate_2
                            locStrAbsAbbre_1 = locStrAbsAbbre_2
                            locDbleAbsTotalHour_1 = locDbleAbsTotalHour_2
                        Next
                    ElseIf locCollPosAbsDateJ.Count = 1 Then
                        Console.WriteLine("             Il n'y a qu'une absence le :" & locDateDateJ)
                        locDbleAbsTotalHour_2 = collInfoEmploy(locIntCompteurEmploy).collCalAbsEmploy(locCollPosAbsDateJ(0)).totalInHour
                        locDbleTempsPresence -= locDbleAbsTotalHour_2
                        Console.WriteLine("             le temps de présence est de : " & locDbleTempsPresence)
                    ElseIf locCollPosAbsDateJ.Count = 0 Then
                        Console.WriteLine("             " & locDateDateJ & " n'est pas un jour d'absence")
                    End If
                End If
 
                QueryPerformanceCounter(glFin)
                Console.WriteLine(TempsTrace())
 
                'il faut vider la liste des positions de jours d'absences pour le jour en cours
                locCollPosAbsDateJ.Clear()
            Next
        Next
 
        QueryPerformanceCounter(loclgPerfTotalFin)
        loclgPerfTotalTraitement = loclgPerfTotalFin - loclgPerfTotalDebut
 
        temps_seconde = (loclgPerfTotalTraitement - (loclgPerfTotalTraitement Mod 1000000)) / 1000000
        temps_milliseconde = ((loclgPerfTotalTraitement Mod 1000000) - (loclgPerfTotalTraitement Mod 1000)) / 1000
        temps_nanoseconde = (loclgPerfTotalTraitement Mod 1000000) Mod 1000
 
        Console.WriteLine(temps_seconde & " s " & temps_milliseconde & " ms " & temps_nanoseconde & "na")
 
    End Sub
Le problème intervient lors de ce calcul :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
 locDbleTempsPresence -= locDbleAbsTotalHour_2
avec pour

locDbleTempsPresence = 7,7
et
locDbleAbsTotalHour_2 = 1.9

pour

locDbleTempsPresence -= locDbleAbsTotalHour_2
il me sort cette valeur : 5.8000000000000007 via l'espion
Il me ressort bien 5,8 mais garde une précision à la con et je vois pas d'ou il me sort ce truc avec plein de zéro.

J'ai vérifier les valeurs, les initialisation et rien a faire.

Je soumet mon code au l'oeil d'un autre développeur.

En vous remerciant d'avance.

Je retourne essayer de comprendre pourquoi, il me fait cette erreur.

++