XL 2016 Extraction partie entière en VBA

gg53

XLDnaute Nouveau
Bonjour à tous,

Confronté à une gestion de stock, je souhaiterais vous exposer mon problème à propos de ce je crois une anomalie lors de l’extraction de la partie entière d’une variable.

En deux mots : j’ai un poids total, le poids d’une palette et je calcule le nombre de palettes par simple division.

Le poids total pouvant être un non multiple du poids d’une palette, j’extrais la partie entière.

Et là, on dirait que la table de 3 pose problème.

Je soumets à vos avis éclairés, le code ci-dessous

Sub Partie_entiere()

Cells.Clear

Cells(1, 1) = "Total" ' titres
Cells(1, 2) = "Poids_palette"
Cells(1, 3) = "Nb_calculé"
Cells(1, 4) = "Nb_pal_entieres"


'1er exemple

poids_total = 2000.8
poids_palette = 500.2 ' poids d'une palette

Cells(2, 1) = poids_total
Cells(2, 2) = poids_palette

nb_palettes = poids_total / poids_palette ' calcul nombre de palettes
Cells(2, 3) = nb_palettes ' affichage nombre calculé


nb_palettes_entieres = Int(nb_palettes) ' calcul partie entière OK
Cells(2, 4) = nb_palettes_entieres


'2eme exemple

poids_total = 2073.6
poids_palette = 691.2 ' poids d'une palette

Cells(4, 1) = poids_total
Cells(4, 2) = poids_palette

nb_palettes = poids_total / poids_palette ' calcul nombre de palettes
Cells(4, 3) = nb_palettes ' affichage nombre calculé


nb_palettes_entieres = Int(nb_palettes) ' calcul partie entière ERRONE
Cells(4, 4) = nb_palettes_entieres

Cells(4, 5) = " <= Calcul erroné"

End Sub
 

job75

XLDnaute Barbatruc

gg53

XLDnaute Nouveau

Dranreb

XLDnaute Barbatruc
Bonjour.
Je pense que le problème vient de ce qu'en binaire virgule flottante double précision, la plus proche valeur possible de 2073,6 est 2073,59999999999990905052982270717620849609375
et celle de 691.2 est 691,200000000000045474735088646411895751953125
Le rapport calculé est 2,999999999999999555910790149937383830547332763671875
ce qui est inférieur à 3.
En VBA le plus simple serait de prendre Int(nb_palettes + 2^-30) par exemple.
 

AtTheOne

XLDnaute Accro
Supporter XLD
Un grand merci pour cette réponse.
J'ai cru tourner fou en étudiant mon code.
Génial. Ca me sauve !!
Encore merci
Bonsoir à tous
C'est bien un problème de représentation des réels en mémoire (sous forme binaire).
J'ai écrit une petite macro qui met en évidence l'écart du quotient obtenu avec la valeur 3.
Comme le quotient stocké est légèrement inférieur à 3 , int renvoie 2 !
Un stockage en variant sous-type Decimal ( via CDec) règle le problème.
Note qu'il suffit d'utiliser CDec juste pour le quotient
 

Pièces jointes

  • Représentation Nombres en mémoire.xlsm
    15.2 KB · Affichages: 6

Discussions similaires

Réponses
0
Affichages
177
Réponses
12
Affichages
616
Réponses
23
Affichages
1 K

Statistiques des forums

Discussions
312 504
Messages
2 089 087
Membres
104 026
dernier inscrit
bernard58