IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Différence exactitude valeurs Single/Double


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juillet 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Juillet 2015
    Messages : 22
    Par défaut Différence exactitude valeurs Single/Double
    Bonjour à tous,

    Je reviens vers vous pour un nouveau problème. Cela concerne la précision des données en "Single" et en "Double".

    Y a-t-il une explication au fait que lorsque j'entre un chiffre à virgule (1.1 par exemple) en input box et qu'il est déclaré en tant que:
    -"Single" --> la valeur n'est pas exacte.
    -"Double" --> la valeur est exacte.



    Merci d'avance

  2. #2
    Membre chevronné Avatar de pasdechances
    Homme Profil pro
    Alternant, Ingénieur en systèmes Informatiques et Industriels
    Inscrit en
    Septembre 2015
    Messages
    218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Alternant, Ingénieur en systèmes Informatiques et Industriels
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Septembre 2015
    Messages : 218
    Par défaut
    bonjour,
    tu as penser à déclaré ta variable ?


  3. #3
    Membre averti
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juillet 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Juillet 2015
    Messages : 22
    Par défaut
    Salut pasdechances,

    Merci de t'intéresser à mon problème. Oui j'ai bien déclaré mes variables. Et c'est justement ça le problème, selon que je la déclare en Single ou double, je n'obtiens pas la même précision!

    Fichier joint dans vos discussions


  4. #4
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Quel est ton code qui produit une valeur inexacte ?

    Si tu attribues à une cellule la valeur décimale d'une variable de type SINGLE, tu pourrais obtenir avec le code suivant une valeur approximative, donc inexacte.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim s As Single
    s = 1.1
    Cells(3, 2).Value = s
    Pour obtenir la valeur exacte de la variable de type SINGLE et non la valeur approximative, il faut utiliser FormulaLocal et CStr :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim s As Single
    s = 1.1
    Cells(2, 2).FormulaLocal = CStr(s)

  5. #5
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut





    Un p'tit bonjour en passant et voir aussi le résultat de cette démonstration ! …



    _____________________________________________________________________________________________________
    Je suis Charlie, Bardo, Sousse

  6. #6
    Membre averti
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juillet 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Juillet 2015
    Messages : 22
    Par défaut
    Bonjour DocMarti,

    Voici le code qui produit l'approximation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub test()
    Dim angle1 As Single
    Dim angle2 As Double
     
    angle1 = Replace(Application.InputBox("First decimal number in Single?", "Single", "15", Type:="1"), ".", ",")
    angle2 = Replace(Application.InputBox("Same decimal number in Double?", "Double", "15", Type:="1"), ".", ",")
     
    Worksheets("Feuil1").Range("A1").Value = angle1
    Worksheets("Feuil1").Range("A2").Value = angle2
     
    End Sub
    Il est vrai qu'avec ta méthode ("Formulalocal" et "Cstrg") cela fonctionne.

    Cela est-il simplement dû à la définition même du type Single (relative précision des nombres à virgules?)

    @Marc-L
    Ton exemple est très intéressant! Si je comprends bien, il semble présenter les effets inverses de mon problème! Mauvaise précision en Double mais pas en Single!

  7. #7
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    En tout cas avec le code que tu donnes, je récupère deux 15 tout ronds avec Excel 2010.

  8. #8
    Membre Expert
    Inscrit en
    Octobre 2010
    Messages
    1 401
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 1 401
    Par défaut
    Citation Envoyé par petitchti Voir le message
    Il est vrai qu'avec ta méthode ("Formulalocal" et "Cstrg") cela fonctionne.

    Cela est-il simplement dû à la définition même du type Single (relative précision des nombres à virgules?)
    Je te suggère d'adopter les nombres Decimal (obtenus grâce à CDec).

    J'ai effectué quelques tests.
    Meme avec FormulaLocal et CStr, le type Single provoque 235 valeurs inexactes sur 1000
    Le type Double est plus juste : seulement 82 sur 1000
    Le type Decimal : 0 sur 1,000,000

    Les nombres Decimal ont une représentation plus précise dans la mémoire que les types à virgule flottante (Single et Double).

    Le type de données Decimal fournit le plus grand nombre de chiffres significatifs pour un nombre. Il prend en charge jusqu'à 29 chiffres significatifs. Le type Single : 7 chiffres, le type Double : 15.

    Ce type de données est particulièrement adapté aux calculs (par exemple, financiers) qui exigent un grand nombre de chiffres, mais qui ne peuvent pas tolérer les erreurs d'arrondi.

    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
    Sub test()
     
    Dim angle1 As Variant
    Dim angle2 As Variant
     
    Dim var1 As Variant
    Dim var2 As Variant
     
    var1 = Replace(Application.InputBox("First decimal number in Single?", "Decimal", "15,60", Type:="1"), ".", ",")
    var2 = Replace(Application.InputBox("Same decimal number in Double?", "Decimal", "0,8055", Type:="1"), ".", ",")
     
     angle1 = CDec(var1)
     angle2 = CDec(var2)
     
     Worksheets("Feuil6").Range("A1").Value = angle1
     Worksheets("Feuil6").Range("A2").Value = angle2
     
    End Sub

  9. #9
    Membre averti
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juillet 2015
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur

    Informations forums :
    Inscription : Juillet 2015
    Messages : 22
    Par défaut
    @ClementMarcotte

    Oui tu récupères 15 tout rond si tu mets 15 tout rond. Mais si tu mets des nombres à virgules (ça dépend lesquels encore, 15.2 par exemple) tu verras des différences. Mais c'est de ma faute, j'ai mis 15 dans le code que j'ai envoyé :/

    @DocMarti

    Merci pour ces précisions.
    Et merci surtout pour le temps que tu as pris à répondre à mes questions.
    Je vais tester la méthode decimal.

    Pour conclure, il est donc normal que les chiffres significatifs après la virgule ne soient pas au rendez-vous des Single, c'est dans la définition de ce type de variable! La lumière est faite

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. différence entre long et double
    Par bolltt dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 25/03/2008, 18h46
  2. Transtypage : Extended -> Single/Double
    Par Mickey974 dans le forum Delphi
    Réponses: 4
    Dernier message: 30/04/2007, 18h46
  3. Calcul String (valeur Hexa) -> double puis double -> char *
    Par ben_ghost dans le forum VC++ .NET
    Réponses: 5
    Dernier message: 30/07/2006, 21h04
  4. Différence entre Integer et double?
    Par Michel DELAVAL dans le forum Access
    Réponses: 15
    Dernier message: 10/02/2006, 15h57
  5. [VB.NET]Comment obtenir conversion exacte Single>Double?
    Par Misterburma dans le forum VB.NET
    Réponses: 9
    Dernier message: 09/02/2006, 22h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo