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

VB.NET Discussion :

[VB.NET]Comment obtenir conversion exacte Single>Double?


Sujet :

VB.NET

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2004
    Messages : 21
    Points : 16
    Points
    16
    Par défaut [VB.NET]Comment obtenir conversion exacte Single>Double?
    Bonjour à tous,

    Je viens de découvrir que la conversion d'un single en double par les fonctions usuels de VS 2003 ne sont pas exact.

    Par exemple une valeur = 12,5 en single donnera en la convertissant en Double la valeur suivante 12,499999754564324

    Je pose la question pourquoi ?

  2. #2
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Pouvez-vous nous donner le code de conversion que vous avez utilisé pour votre test :
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2004
    Messages : 21
    Points : 16
    Points
    16
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Dim aSingleValue as Single
    Dim aDoubleValue as Double
     
    aSingleValue = 12,4
    aDoubleValue = CDbl(aSingleValue )
    En réalité la valeur de aSingleValue est issu de la lecture d'un fichier binaire. J'ai vérifié et je stocke correctement dans aSingleValue la bonne valeur extraite.

    Merci

  4. #4
    Expert éminent
    Avatar de neguib
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    3 627
    Détails du profil
    Informations personnelles :
    Âge : 63
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 627
    Points : 7 879
    Points
    7 879
    Par défaut
    Comme je ne peux pour l'instant faire moi même les tests
    je te suggères l'utilisation de la classe Convert
    Essayes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim aSingleValue as Single = 12,4
    Dim aDoubleValue as Double 
     
    aDoubleValue = Convert.ToDouble(aSingleValue)
    Celà donne-t-il le même resultat :
    Pour le bien de ceux qui vous lisent, ayez à coeur le respect du forum et de ses règles

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2004
    Messages : 21
    Points : 16
    Points
    16
    Par défaut
    J'ai tout essayé,

    Je dois faire un Cdec ou Convert.Todecimal de ma valeur Single et ensuite je la converti en Double pour avoir la valeur correcte.

    Ma question est simplement de savoir pourquoi j'ai un delta ?

  6. #6
    Inscrit

    Profil pro
    Inscrit en
    Février 2004
    Messages
    862
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2004
    Messages : 862
    Points : 1 229
    Points
    1 229
    Par défaut
    J'ai testé par moi-même :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    			Single s = 12.4F;
    			double d = System.Convert.ToDouble(s);
    			MessageBox.Show(d.ToString());
    Résultat : 12.3999996185303




    N'utilisant jamais le type Single, je n'avais jamais remarqué ça...A mon avis il s'agit d'un bug.
    In my experience, any attempt to make any system idiot proof will only challenge God to make a better idiot.

  7. #7
    Membre chevronné
    Avatar de Piotrek
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 869
    Points : 1 904
    Points
    1 904
    Par défaut
    non c'est normal:

    http://www.developpez.net/forums/viewtopic.php?t=414775
    la reponse de Dev01

  8. #8
    Inscrit

    Profil pro
    Inscrit en
    Février 2004
    Messages
    862
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2004
    Messages : 862
    Points : 1 229
    Points
    1 229
    Par défaut
    Citation Envoyé par Piotrek
    non c'est normal:
    Oui, ok s'il s'agit d'une opération, mais là on parle d'un simple changement de type.
    In my experience, any attempt to make any system idiot proof will only challenge God to make a better idiot.

  9. #9
    Membre chevronné
    Avatar de Piotrek
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Mars 2004
    Messages
    869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Mars 2004
    Messages : 869
    Points : 1 904
    Points
    1 904
    Par défaut
    Some widening conversions to Single or Double can cause a loss of precision
    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpguide/html/cpcontypeconversiontables.asp

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    487
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Juillet 2002
    Messages : 487
    Points : 621
    Points
    621
    Par défaut
    Les single et double sont stockées sous la forme n*2^p alors que nous les voyons toujours en base 10 notés m*10^q (ou mEq) dans un compilateur ou un debugger.

    Quand on tronque une valeur double en single, ce ne sont pas des décimales 0 en base 10 mais des "décimales" non nulles en base 2 qui disparaissent.

    Le résultat est donc différent une fois affiché en base 10.
    On ne peut pas faire boire un âne qui n'a pas soif.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 30/05/2006, 12h29
  2. [ADO.Net][VB.Net]Comment obtenir DateTime via FieldName?
    Par RiiiDD dans le forum Accès aux données
    Réponses: 2
    Dernier message: 29/03/2006, 13h19
  3. [VB.NET]Comment obtenir un type à partir d'un string?
    Par NicolasJolet dans le forum VB.NET
    Réponses: 2
    Dernier message: 24/02/2006, 15h46
  4. Réponses: 2
    Dernier message: 29/01/2006, 22h51
  5. [VB.Net] Comment obtenir utilisateur Windows en cours ?
    Par totoranky dans le forum VB.NET
    Réponses: 2
    Dernier message: 25/01/2006, 11h55

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