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

Développement Web avec .NET Discussion :

Problème de conversion en double : Trop de chiffres après la virgule


Sujet :

Développement Web avec .NET

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 228
    Points : 60
    Points
    60
    Par défaut Problème de conversion en double : Trop de chiffres après la virgule
    Bonjour,

    Petit soucis :

    J'ai un label affichant un prix (9,99).
    Dans mon code behind, je le convertis en Double pour l'insérer en base (champ type double).

    Je fais donc un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double prixttc = Convert.ToDouble(label.Text);
    La conversion se fait bien mais j'obtiens 9.9900000000000002 ... Du coup ça ne rentre pas en base.

    Quelqu'un aurait une idée ?

    Merci d'avance.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Scots Voir le message
    J'ai un label affichant un prix (9,99).
    Dans mon code behind, je le convertis en Double pour l'insérer en base (champ type double).
    Déjà tu es mal parti... un label sert à afficher une valeur, et uniquement à ça. En aucun cas ça ne doit être le "stockage de référence" de la valeur. Tu devrais avoir la valeur d'origine quelque part dans une variable, une propriété d'un objet, une DataTable ou quelque chose comme ça, pas la relire à partir de l'interface graphique (sauf bien sûr dans le cas où c'est une valeur saisie par l'utilisateur)

    D'autre part, le type Double n'est pas adapté pour les valeurs financières. Il faut utiliser le type Decimal, qui est fait pour ça.

    Citation Envoyé par Scots Voir le message
    Je fais donc un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double prixttc = Convert.ToDouble(label.Text);
    La conversion se fait bien mais j'obtiens 9.9900000000000002 ... Du coup ça ne rentre pas en base.
    Le type Double ne peut pas stocker des valeurs décimales exactes, parce qu'il représente un nombre en virgule flottante binaire ; à part quelques valeurs qui tombent juste, la valeur qui est effectivement stockée dans la variable est une approximation. En l'occurrence 9.99 n'a pas de représentation exacte en virgule flottante binaire.

    Le type Decimal, en revanche, représente un nombre en virgule flottante décimale, et permet donc de stocker des valeurs décimales exactes. C'est pour ça qu'il faut toujours utiliser ce type pour des valeurs financières.

    De plus, quand tu dis "ça ne rentre pas en base", que veux-tu dire exactement ? Quel est le type de la colonne dans la DB ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 228
    Points : 60
    Points
    60
    Par défaut
    Merci Tomlev,

    J'avais déjà essayé avec DECIMAL mais j'avais oublié le (10,2) et laissé le (10,0) par défaut ...

    Du coup, ok. Et je vois mon erreur : Lorsque je fais ma conversion de String en Decimal, il met une virgule au lieu d'un point. Du coup j'ai une erreur sur le Insert.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Scots Voir le message
    Du coup, ok. Et je vois mon erreur : Lorsque je fais ma conversion de String en Decimal, il met une virgule au lieu d'un point. Du coup j'ai une erreur sur le Insert.
    Un Decimal, en soit, ne contient pas de virgule ou de point dans un decimal ; c'est seulement dans sa représentation sous forme de chaine que ça apparaît.

    Je pense que tu construis ta requête SQL en concaténant la valeur dans la chaine ; il ne faut absolument pas faire ça, c'est une source de bugs et de failles de sécurité (injection SQL). Il faut utiliser une requête paramétrée : http://johannblais.developpez.com/tu...s-donnees/#LIV

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 228
    Points : 60
    Points
    60
    Par défaut
    Pas du tout, je ne fais aucune concaténation de chaine.

    Je lis une valeur en base Table1, je l'affiche dans un Label, je clique sur un bouton, je l'insère en base Table2.

    Je lis un décimal, je l'affiche en string et je veux le réinsérer en décimal ...

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Scots Voir le message
    Je lis une valeur en base Table1, je l'affiche dans un Label, je clique sur un bouton, je l'insère en base Table2.
    Fais voir le code que tu utilises pour l'insertion

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 228
    Points : 60
    Points
    60
    Par défaut
    Voici le bout de code concerné :

    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
    decimal prixttc = Convert.ToDecimal(prixLabel.Text);
     
            //Récupération du dernier numéro de facture
            string CommandFact="SELECT numero_facture FROM facture LIMIT 1";
            MySqlConnection myConnectionFact = new MySqlConnection(ConnectionString);
            MySqlCommand myCommandFact = new MySqlCommand(CommandFact, myConnectionFact);
     
            myConnectionFact.Open();
            string fact = Convert.ToString(myCommandFact.ExecuteScalar());
            myConnectionFact.Close();
     
            string numFact = fact + 1;
     
            //On stock en session les infos utiles
            Session["Internaute_Email"] = user;
            Session["Abonnement_Id"] = idLabel.Value;
     
            //On créé la facture
            string Command = "INSERT INTO facture (numero_facture, email, produit, ttc, date_facture, paiement) VALUES ('" + numFact + "', '" + user + "', '" + idLabel.Value + "', '" + prixttc + "', '" + datecr + "', '0')";
            MySqlConnection myConnection = new MySqlConnection(ConnectionString);
            MySqlCommand myCommand = new MySqlCommand(Command, myConnection);
     
            myConnection.Open();
            myCommand.ExecuteScalar();
            myConnection.Close();

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Donc c'est bien ce que je disais, tu crées ta requête par concaténation :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string Command = "INSERT INTO facture (numero_facture, email, produit, ttc, date_facture, paiement) VALUES ('" + numFact + "', '" + user + "', '" + idLabel.Value + "', '" + prixttc + "', '" + datecr + "', '0')";
    Il ne faut jamais inclure la valeur directement dans la requête.
    - Ca pose des problèmes de format des nombres et des dates, car ils ne sont pas formatés pareil selon la langue ; par exemple en français les nombres décimaux s'écrivent avec une virgule, et en SQL il faut les écrire au format américain, donc avec un point. C'est pour ça que tu as des problèmes pour insérer la valeur en base.
    - C'est une faille béante de sécurité, en particulier dans une application web (ce qui semble être ton cas), car ton code est vulnérable à une attaque par injection SQL.

    Regarde le tutoriel que je t'ai indiqué plus haut pour utiliser une requête paramétrée.

  9. #9
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 228
    Points : 60
    Points
    60
    Par défaut
    J'avais cru que tu me parlais de concaténation de champs, oui tu raison. Je fais déjà ça pour tester mais bien sûr j'avais prévu de faire une requête paramétrée.

    Tu pense que mon problème serait résolu avec ça ???

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par Scots Voir le message
    Tu pense que mon problème serait résolu avec ça ???
    J'en suis même certain (à condition que le type de la colonne en base soit compatible bien sûr)

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 228
    Points : 60
    Points
    60
    Par défaut
    C'est bien un champs DECIMAL(10,2)

    Je testes ça et je te dirais.

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    228
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 228
    Points : 60
    Points
    60
    Par défaut
    Ok, bien vu !

    Merci beaucoup Tomlev

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

Discussions similaires

  1. Afficher un double avec 2 chiffres après la virgule
    Par luilui dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 08/12/2010, 18h19
  2. Trop de chiffres après la virgule
    Par Chicard dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 26/02/2009, 14h51
  3. Double avec deux chiffres après la virgule
    Par Viscapon dans le forum Débuter avec Java
    Réponses: 32
    Dernier message: 14/02/2009, 17h50
  4. Double : forcer 2 chiffres après la virgule
    Par womannosky dans le forum Langage
    Réponses: 2
    Dernier message: 15/01/2009, 16h18
  5. Réponses: 1
    Dernier message: 21/04/2008, 16h00

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