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

ASP.NET Discussion :

Problème d'arrondi bizarre


Sujet :

ASP.NET

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Janvier 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2013
    Messages : 29
    Par défaut Problème d'arrondi bizarre
    Bonjour,

    J'ai dans un script une valeur que je reçois en type double et que je dois convertir en string et garder 2 chiffres après la virgule (sans arrondir).
    Le problème est que le .toString("N2") arrondit automatiquement, de même que la conversion en int.
    J'ai donc opté pour une autre solution, qui consiste à convertir la partie après la virgule en int en arrondissant à l'entier du dessous (Math.Floor).
    Problème, sur une valeur, lorsque je multiplie la partie de deux chiffres après la virgule par 100 (pour avoir la partie entière), il me ressort une valeur illogique (voir les commentaires du code ci-dessous).
    Avez-vous une solution ?

    Merci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Double valeur = item.maValeur.Value;   // 1001.29
    int valeur1 = Convert.ToInt32(Math.Floor(valeur));
    Double valeur1Double = Convert.ToDouble(valeur1);
    Double valeur2Double = valeur - valeur1Double;   // 0.29
    Double total = valeur2Double * 100; 
    // lorsque je fais total.toString() il me renvoie 28.99999994 au lieu de 29
    int valeur2 = Convert.ToInt32(Math.Floor(total));  
    // ici le 29,0 est convertit en 28...
    Concrètement voici le principe :
    Je récupère la valeur double.
    Je converti en int pour garder la partie entière.
    Je reconverti en double pour faire l'opération suivante : soustraire pour garder uniquement la partie après la virgule.
    Je multiplie par 100 et je reconvertis en int pour avoir les 2 chiffres tels quels de la partie décimale (donc pas eu d'arrondi)
    Je concatène le partie entière et décimale dans un string.

  2. #2
    Membre très actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2007
    Messages : 871
    Par défaut
    Et voila,

    d = (double)SystemMath.Truncate(100.666 * 100) / 100; // 100.666 --> 100.66

  3. #3
    Membre averti
    Homme Profil pro
    Analyste programmeur
    Inscrit en
    Janvier 2013
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyste programmeur
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2013
    Messages : 29
    Par défaut
    Citation Envoyé par mermich Voir le message
    Et voila,

    d = (double)SystemMath.Truncate(100.666 * 100) / 100; // 100.666 --> 100.66
    Effectivement j'ai corrigé avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    double x = Math.Truncate(valeur * 100) / 100;
                                        string s = string.Format("{0:N2}", x);
    Mais je ne comprends pas, pourquoi le .toString("N2") fait un arrondi ? C'est normal ?
    Et surtout je n'ai pas compris pourquoi je me suis retrouvé avec un 28,9999994... bizarre...

  4. #4
    Membre très actif
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2007
    Messages
    871
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Février 2007
    Messages : 871
    Par défaut
    Re,

    Les doubles sont des nombres flottants, donc non 'finis'
    cf : http://msdn.microsoft.com/en-us/libr...(v=vs.80).aspx

    A utiliser que pour les matheux et pas pour des données comptables ou applicatifs métiers.
    Coté performances, ça doit être assez semblable pour que l'on ne s'y intéresse pas (c'est mon point de vue).

    Je ne connais pas le contexte de ton problème mais, il me semble que tu ne devrais pas utiliser de doubles mais des decimal par exemple

    cf: http://stackoverflow.com/questions/6...nd-double-in-c

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

Discussions similaires

  1. [Perf/Bug??]9.2.0.1-Problème de performance bizarre.
    Par Le nain Attila dans le forum Oracle
    Réponses: 25
    Dernier message: 07/12/2005, 14h37
  2. [DECIMAL] problème d'arrondi
    Par Boosters dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 28/11/2005, 15h30
  3. Problème socket raw ? bizarre :~
    Par MonsieurAk dans le forum Windows
    Réponses: 2
    Dernier message: 12/07/2005, 14h12
  4. Problème d'arrondi
    Par ptitsoleil87 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 07/01/2005, 09h37
  5. Problème de LINK Bizarre !!
    Par Jasmine dans le forum MFC
    Réponses: 24
    Dernier message: 19/03/2004, 15h58

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