none
Problème d'interprétation d'une valeur double RRS feed

  • Question

  • Bonjour,
    J'ai une application client serveur:
    Dans Le client, J'ai une méthode de Classe C++ CLI qui appelle Une méthode serveur en passant en paramètre un objet managé c# nommé "TransactionC#"

    La classe TransactionC# a une propriété : double Prix = 1.56 (Insérée à travers un TextBox)

    ClasseC++CLI
    {
    void ClasseC++CLI::Methode(TransactionC#^ transaction)
    {
    InterfaceServeur.Methode(transaction);
    }
    }

    Cette propriété est interprété avec l'application client avec la valeur 1.56
    Mais elle est interprété avec la partie serveur comme Prix = 1.5600000000000001

    Je ne pense pense pas que c'est d'u au remoting car : dans l'application client, j'ai débugé la classe transaction.Cs j'ai bien Prix = 1.56.
    Mais Dans la classeC++CLI.CPP je débugué l'objet transaction qui est passé en paramètre et j'ai la valeur 1.5600000000000001

    Est ce que vous avez une explication s'il vous plait?
    vendredi 19 novembre 2010 14:19

Réponses

  • Bonjour,

    N'y a t'il pas un calcul sur cette valeur avant sa transmission ? Que donne valeur.ToString("r") sur le client avant la transmission au serveur ?

    Les valeurs en virgule flottante sont connues pour favoriser l'étendue par rapport à la précision ce qui génère parfois des valeurs stockées d'une façon approximative et dont les chiffres les moins significatifs sont ignorés à l'affichage jusqu'à ce qu'ils finissent par se manifester. Ma compréhension est que le format "r" affiche la valeur réellement stockée en mémoire.

    Par exemple voir ce qu'affiche le code ci-dessous (l'ajout de 1.56 compromet la précision du stockage des chiffres moins significatifs) :

          double d = 1e-15;
          d += 1.56;
          MessageBox.Show(d.ToString()+"\n"+d.ToString("r"));
    

     

     

     


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    • Proposé comme réponse Papy Normand vendredi 19 novembre 2010 20:12
    • Marqué comme réponse smaoui mardi 23 novembre 2010 13:39
    vendredi 19 novembre 2010 17:21
    Modérateur
  • Bonjour,

     

    Le problème pourrait venir aussi du débogueur de l’IDE, car il me semble similaire à cela :

    http://www.mail-archive.com/advanced-dotnet@discuss.develop.com/msg00782.html

    . Essayez d’implémenter un log et d’écrire les valeurs du serveur et du client en mode release.

     

    Cordialement,

    Alex

    ________________

    Publiez un article sur MSDN !

    Windows Phone 7

    Astuces pour Visual Studio 2010

    XNA – Développement jeux vidéo

    Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Silverlight, Workflow Foundation, WPF

    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

     

     


    Suivez MSDN sur Twitter 

    • Marqué comme réponse smaoui mardi 23 novembre 2010 13:39
    lundi 22 novembre 2010 15:02

Toutes les réponses

  • Bonjour,

    N'y a t'il pas un calcul sur cette valeur avant sa transmission ? Que donne valeur.ToString("r") sur le client avant la transmission au serveur ?

    Les valeurs en virgule flottante sont connues pour favoriser l'étendue par rapport à la précision ce qui génère parfois des valeurs stockées d'une façon approximative et dont les chiffres les moins significatifs sont ignorés à l'affichage jusqu'à ce qu'ils finissent par se manifester. Ma compréhension est que le format "r" affiche la valeur réellement stockée en mémoire.

    Par exemple voir ce qu'affiche le code ci-dessous (l'ajout de 1.56 compromet la précision du stockage des chiffres moins significatifs) :

          double d = 1e-15;
          d += 1.56;
          MessageBox.Show(d.ToString()+"\n"+d.ToString("r"));
    

     

     

     


    Please always mark whatever response solved your issue so that the thread is properly marked as "Answered".
    • Proposé comme réponse Papy Normand vendredi 19 novembre 2010 20:12
    • Marqué comme réponse smaoui mardi 23 novembre 2010 13:39
    vendredi 19 novembre 2010 17:21
    Modérateur
  • Bonjour,

    Je vous remercie pour votre réponse.

    Cette propriété est bindée à un textBox :

    this.txtPrix.DataBindings.Add("Text", transaction, "Prix");

    Le MessageBox.Show(transaction.Price.Tostring() \n  transaction.Price.Tostring("r")) Affiche toujours 1.56

     

    J'ai fait deux déboggage différent :pour la même ligne de code : InterfaceServeur.Methode(transaction);

     

    - Un Par le déboguer Du client c++cli   : Pris affiché par l'espion = 1.56000000000001

    - Un par le debogguer c# de la dll utilisé par le client c++cli qui contient l'objet TransactionC# : Pris affiché par l'espion = 1.56

    Est ce que ça pourrait étre dû à un paramêtrage de compilation?

     

     

     

    lundi 22 novembre 2010 11:23
  • Bonjour,

     

    Le problème pourrait venir aussi du débogueur de l’IDE, car il me semble similaire à cela :

    http://www.mail-archive.com/advanced-dotnet@discuss.develop.com/msg00782.html

    . Essayez d’implémenter un log et d’écrire les valeurs du serveur et du client en mode release.

     

    Cordialement,

    Alex

    ________________

    Publiez un article sur MSDN !

    Windows Phone 7

    Astuces pour Visual Studio 2010

    XNA – Développement jeux vidéo

    Didacticiels et astuces : VB.NET, C#, ASP.NET, .NET Framework, Silverlight, Workflow Foundation, WPF

    Microsoft propose ce service gratuitement, dans le but d'aider les utilisateurs et d'élargir les connaissances générales liées aux produits et technologies Microsoft. Ce contenu est fourni "tel quel" et il n'implique aucune responsabilité de la part de Microsoft.

     

     


    Suivez MSDN sur Twitter 

    • Marqué comme réponse smaoui mardi 23 novembre 2010 13:39
    lundi 22 novembre 2010 15:02
  • Bonjour,

    Je pense que ce lien peut donner une explication au problème  :  http://floating-point-gui.de/basic/

    Je vais implémenter un log et vérifier si, sur la même machine, on peut avoir une représentation différente des doubles !!!.

     

     

    • Marqué comme réponse smaoui mardi 23 novembre 2010 13:38
    • Non marqué comme réponse smaoui mercredi 24 novembre 2010 08:44
    mardi 23 novembre 2010 09:57