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

C# Discussion :

Pb d'arrondie de type double


Sujet :

C#

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2005
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 25
    Points : 20
    Points
    20
    Par défaut Pb d'arrondie de type double
    Bonjour,

    Je voudrais savoir pourquoi lorsque je fais 60.0/100.0 le resultat retourné est 0.59999999999999998 . Je suis au courant qu'il existe des imprécisions, mais pourquoi j'ai un problème avec une décimale !?

    Il me faut absolument 0.6 en retour, et j'aimerais éviter de devoir mettre des arrondis partout !!!

    Merci d'avance pour votre aide

  2. #2
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    400
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 400
    Points : 444
    Points
    444
    Par défaut
    Utilise la classe decimal..

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    231
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Juillet 2004
    Messages : 231
    Points : 165
    Points
    165
    Par défaut
    Citation Envoyé par la debutante Voir le message
    Bonjour,

    Je voudrais savoir pourquoi lorsque je fais 60.0/100.0 le resultat retourné est 0.59999999999999998 . Je suis au courant qu'il existe des imprécisions, mais pourquoi j'ai un problème avec une décimale !?

    Il me faut absolument 0.6 en retour, et j'aimerais éviter de devoir mettre des arrondis partout !!!

    Merci d'avance pour votre aide

    Que ce soit urgent ou non, ça ne vas pas inciter les gens à répondre plus rapidement.

    Comment veux tu avoir un arrondi sans avoir à lui demander d'arrondir ?
    A moins de faire une fonction qui te fais la division et te retourne le résultat arrondit, je ne vois pas comment faire

  4. #4
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    400
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 400
    Points : 444
    Points
    444
    Par défaut
    dinbougre je crois que tu à mal saisi sa question. Elle ne souhaite pas arrondir.
    C'est juste que le résultat d'une division lui envoi une valeur approximative... Ce qui est normale si on utilise les classes float ou double. La classe decimal quand à elle permet de récupérer la valeur exacte d'une division. Cependant, elle reste moins performante.

  5. #5
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    Un problème de ce genre a déjà etait traité. La fonction recherche existe pour qu'on les retrouve et qu'on evite de reposer 36 000 fois la même question.

    Si c'est pour faire des calculs, inutile d'arrondir, le résultat mathématique d'opération est toujours plus juste lorque l'on n'arrondis pas.
    Si c'est un problème d'affichage, la fonction ToString peut peut être régler ce problème.

  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 : 43
    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 753
    Points
    39 753
    Par défaut
    lorsque je fais 60.0/100.0 le resultat retourné est 0.59999999999999998
    C'est dû à la représentation binaire des flottants : tu ne peux pas coder la valeur exacte 0.6 en binaire, donc il prend la valeur la plus proche possible.
    La réponse de oyigit me semble bonne... utiliser le type decimal au lieu de double ou float devrait resoudre le probleme.

  7. #7
    Expert confirmé
    Avatar de ced600
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Août 2006
    Messages
    3 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Août 2006
    Messages : 3 364
    Points : 4 061
    Points
    4 061
    Par défaut
    dinbougre je crois que tu à mal saisi sa question
    Oups moi aussi du coup

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2005
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 25
    Points : 20
    Points
    20
    Par défaut
    Merci pour vos réponses.

    J'ai deja testé decimal, mais étant donné que j'ai beaucoup de calcul, je souhaiterai quelques choses de plus performant !?
    Avez-vous des idées !?

  9. #9
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    Mon avis c'est que ce que tu appelles "beaucoup de calcul" est en fait bien inférieur au seuil de détection d'une baisse de performance...
    Tu as testé avant de demander autre chose ? Quel est le pourcentage de perte de performance lors de l'utilisation de Decimal ?

  10. #10
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    400
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 400
    Points : 444
    Points
    444
    Par défaut
    De plus tu t'attaque à des problème d'imprécisions vieux comme le monde... Ce ne sont pas des problèmes du à C# ni au FrameWork, mais bel et bien au mode de fonctionnement de nos microprocesseur.

    Il n'existe pas d'autres solutions, a moins d'arrondir la valeur de ton résultat si tu connais le nombre de décimal par avance. Par exemple arrondir 0.599999 à 0.6 n'est pas très difficile...

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2005
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 25
    Points : 20
    Points
    20
    Par défaut
    Merci pour votre aide.
    Je vais voir cue je vais faire !!!

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

Discussions similaires

  1. pb - résultat de type double/float arrondi
    Par Ayana dans le forum Langage
    Réponses: 38
    Dernier message: 23/10/2007, 21h05
  2. Variable de type double
    Par Linaa dans le forum C
    Réponses: 16
    Dernier message: 21/01/2006, 14h04
  3. [C++] faire un arrondi sur un double
    Par pavlacki dans le forum C++
    Réponses: 6
    Dernier message: 13/11/2005, 17h50
  4. arrondi avec type double
    Par la drogue c'est mal dans le forum MFC
    Réponses: 6
    Dernier message: 08/04/2005, 18h51
  5. [LG]Convertir le type double en string
    Par @tom@ dans le forum Langage
    Réponses: 8
    Dernier message: 18/01/2004, 20h20

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