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

MFC Discussion :

arrondi avec type double


Sujet :

MFC

  1. #1
    Membre émérite
    Avatar de la drogue c'est mal
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    2 253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 2 253
    Points : 2 747
    Points
    2 747
    Par défaut arrondi avec type double
    bonjour,

    ca doit bien etre la permiere fois que je post une question dans ce forum mais j'ai une grosse fleme aujourd'hui

    j'ai une variable de type "double" et je fais des calculs avec et que je me retrouve avec des problemes d'arrondis.

    par exemple, au lieu d'avoir 0 je me retrouve avec -1.819999999999 * 10^-12 (soit -0.000000000001819999999)

    comment faire pour avoir 0 Pile ???
    il y a du linge sur la corde à linge

  2. #2
    Membre régulier
    Inscrit en
    Décembre 2003
    Messages
    99
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 99
    Points : 82
    Points
    82
    Par défaut
    Salut,

    C'est peut etre stupide mais essaye de caster en int, quand tu veux supprimer les décimales.

    Ou alors tu peux utiliser la fonction ceil (pour arrondir par exces) ou alors floor(pour arrondir par defaut) ou alors si tu veux plus de precisions utilise le type long double.
    "Il n'existe que deux choses infinies, l'univers et la bêtise humaine... mais pour l'univers, je n'ai pas de certitude absolue." A. Einstein

  3. #3
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    En général on prend le problème dans l'autre sens : on laisse l'imprécision dans nos flottants, et on gère celle-ci dans le reste du code (habituellement on introduit un espilon très petit, pour les comparaisons par exemple).

    Le tout c'est de savoir pourquoi / dans quel contexte tu as besoin de te débarasser de cette imprécision.

  4. #4
    Membre émérite
    Avatar de la drogue c'est mal
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    2 253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 2 253
    Points : 2 747
    Points
    2 747
    Par défaut
    Salut,

    C'est peut etre stupide mais essaye de caster en int, quand tu veux supprimer les décimales.

    Ou alors tu peux utiliser la fonction ceil (pour arrondir par exces) ou alors floor(pour arrondir par defaut) ou alors si tu veux plus de precisions utilise le type long double.
    caster avec un int ou utiliser ceil/floor me fait perdre la précision dont j'ai besoins (j'affiche des chiffre à virgule)

    Citation Envoyé par Loulou24
    En général on prend le problème dans l'autre sens : on laisse l'imprécision dans nos flottants, et on gère celle-ci dans le reste du code (habituellement on introduit un espilon très petit, pour les comparaisons par exemple).

    Le tout c'est de savoir pourquoi / dans quel contexte tu as besoin de te débarasser de cette imprécision.
    pour l'affichage: étant donnée que je manipule un nombre "floatant" je ne vais pas afficher 12 chiffres apres la virgule donc je n'affiche que 3 chiffres apres la virgule.

    Le probleme se pose pour les chiffre négatif car à la fin je me retrouve avec -0.000000000000454546 et faire un format de ce truc la bah ca m'affiche à l'ecran : -0.000

    moins zero à l'ecran, ca fait négligé....

    pour l'instant je me suis fait ca vite fait "dans l'urgence":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    void ArroundZero(double & value)
    {
    	if( value <= 0.000001 && value > 0 )
    		value = 0;
     
    	if( value >= -0.000001 && value < 0 )
    		value = 0;
    }
    si quelqu'un à mieux, je suis preneur
    il y a du linge sur la corde à linge

  5. #5
    Membre éclairé
    Avatar de matazz
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 471
    Points : 668
    Points
    668
    Par défaut
    ben moi je me suis fait une méthode d'arrondis, elle vaut ce qu'elle vaut ...


    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
    26
    27
    28
    29
    30
    31
     
    /*******************************************************************/
    //Calcul de l'arrondi d'un double
    /*******************************************************************/
    __int64 COutils::GetRoundOf(double Value)
    {
    	return  (__int64)(Value+0.5);
    }
     
    /*******************************************************************/
    //Calcul de l'arrondi d'un double
    /*******************************************************************/
    double COutils::GetRoundOf(double Value, int precision)
    {
    	double Round  = 0.0;
    	double multiple = 0.0;
    	switch (precision)
    	{
    		case 0 : multiple = 1.0;			break;
    		case 1 : multiple = 10.0;			break;
    		case 2 : multiple = 100.0;		break;
    		case 3 : multiple = 1000.0;		break;
    		case 4 : multiple = 10000.0;	break;
    		case 5 : multiple = 100000.0;	break;
    		default: multiple = 10000.0;	break;
    	}
     
    	Value = Value * multiple;
    	__int64 temp = GetRoundOf(Value);
    	return ((double)temp)/multiple;
    }
    Je travaille avec des __int64 parce que je manipule des gros chiffres...
    Qui va piano va sano...

  6. #6
    Rédacteur
    Avatar de farscape
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2003
    Messages
    9 055
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Novembre 2003
    Messages : 9 055
    Points : 17 323
    Points
    17 323
    Par défaut
    salut ,
    j'ai un peu le meme type de traitement :
    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
     
    #include <math.h>
    double Roundn(double dValue,int nDecimales)
    {   
       double ad[6]={1.,10.,100.,1000.,10000.,100000.};
     
       if (nDecimales<0 || dValue==0.) return(dValue);      
       double dSeuil =(dValue<0.?-.5:.5);
       double dPrec=0.;
       if(nDecimales>=0 && nDecimales<=5) dPrec=ad[nDecimales];
       else
       {
            dPrec=ad[5];         
            for(int i=1;i<nDecimales-4;i++) dPrec*=10.;
            dPrec=floor(dPrec);
       }
       double dCalc = (((dValue*dPrec)+dSeuil));
     
       if(dValue<0.)
          return(ceil(dCalc)/dPrec);
       else      
          return(floor(dCalc)/dPrec);
    } 
    d=Roundn(1.1235,3); // donne 1.124

  7. #7
    Membre éclairé
    Avatar de matazz
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    471
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 471
    Points : 668
    Points
    668
    Par défaut
    D'ailleurs, j'ai voulu simplifier pour le post et du coup j'ai introduis une erreur car ma première méthode marche que pour les nombres positifs...
    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
     
    /*******************************************************************/
    //Calcul de l'arrondi d'un double
    /*******************************************************************/
    __int64 COutils::GetRoundOf(double Value)
    {
    	return  (__int64)(Value+(0.5*GetSignOf(Value, 0)));
    }
     
     
     
    //*******************************************************************
    // retroune le signe de la valeur
    //*******************************************************************
    int COutils::GetSignOf(double Valeur,int ZeroSign)
    {
    	if (Valeur == 0)
    		{return ZeroSign;}
    	else if (Valeur < 0)
    		{return -1;}
    	else
    		{return 1;}
    }
    Qui va piano va sano...

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, 20h05
  2. Pb d'arrondie de type double
    Par la debutante dans le forum C#
    Réponses: 10
    Dernier message: 19/09/2007, 16h47
  3. Réponses: 15
    Dernier message: 10/05/2007, 13h36
  4. Calcul avec type Double
    Par virgul dans le forum C#
    Réponses: 3
    Dernier message: 09/03/2007, 16h41
  5. problème d'overflow avec variable type double
    Par ben83 dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 15/02/2007, 09h55

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