Signaler

Afficher des float sous un format specifique [Résolu]

Posez votre question astrocurieux 89Messages postés mardi 24 février 2015Date d'inscription 30 novembre 2016 Dernière intervention - Dernière réponse le 30 nov. 2016 à 22:52
Bonjour amis geeks !

me voila confronté a un problème bien connus, mais j'ai pas encore trouvé mon bonheur sur internet alors je viens vous sollicité .

voila les deux petite problémes :

1) comment arrondir au supérieure des float déjà formaté pour afficher 3 chiffres après la virgules ?

2) comment faire pour ajouté des zéro après les floats qui n'ont pas 3 chiffres après la virgules ?

voila un peu de code, si au passage vous voulez m’insulter sur mon code pas optimisé je vous l'autorise a condition de me dire comment faire mieux :

ce que je vise =>


ce que j'ai actuellement => (peut être quelque erreur de calcule qui traîne ou les arrondie sup pas pris en comptes ? attention au décalage )



mes fonctions : (DisplayTab contient bien plus de lignes mais j'ai simplifier)

int Cal::DisplayTab()
{
  std::cout << "----------------------------------------" << std::endl;
  std::cout << "      X=10  X=20  X=30  X=40  X=50  Ylaw" << std::endl;
  std::cout << "Y=10  " << DisplayVec(0) << "   " << DisplayVec(1) << "  " << DisplayVec(2) << "  " << DisplayVec(3) << "  " << DisplayVec(4) << "  " << DisplayVec(5) << std::endl;
  std::cout << "----------------------------------------" << std::endl;
  return (0);
}

float Cal::DisplayVec(int num)
{
  std::stringstream ss;
  float val;

  ss << std::fixed << std::setprecision(3) << this->_Tab[num];
  ss >> val;
  return (val);
}


je suis a votre écoute, en comptant sur votre réactivité habituel !
merci.
Afficher la suite 
Utile
+0
moins plus
Bonjour,

Ta fonction displayVect fait tout ce qu'il faut pour afficher correctement un nombre avec 3 décimales, puis le re-transforme en flottant perdant ainsi tout formattage!
remplace les float par std::string dans cette fonction pour retourner une chaîne formattée
astrocurieux 89Messages postés mardi 24 février 2015Date d'inscription 30 novembre 2016 Dernière intervention - 28 nov. 2016 à 21:47
j'ai souris, puis je me suis sentie con ...

Merci Dalfab, voila un problème en moins dans ma soirée.

Il me reste donc a trouvé comment arrondir ses 3 derniers chiffres après la virgules ...
j'ai trouvé une discutions sur ce forum qui répond a mon problème :
(fonction codé par farscape)

double GetDecExp(int nDec)
{	
	double dRet;
	double ad[6]={1.,10.,100.,1000.,10000.,100000.};
 
	if(nDec>=0 && nDec<=5) return(ad[nDec]);
	dRet=ad[5];			
	for(int i=1;i<nDec-4;i++) dRet*=10.;
	return floor(dRet);
}
 
double Roundn(double dValue,int nDecimales)
{
	if (nDecimales<0 || dValue==0.) return(dValue);
 
	double dSeuil =(dValue<0.?-.5:.5);
 
	double dExp=GetDecExp(nDecimales);
 
 	double dCalc = (((dValue*dExp)+dSeuil));
 
	if(dValue<0.)
		return(ceil(dCalc)/dExp);
	else		
		return(floor(dCalc)/dExp);
}


mais je comprend pas tout ...

il n'existe donc pas de fonction intégrer a la lib <Iomanip> (ou une autres) pour formater mon arrondie ?

merci encore !
Répondre
Ajouter un commentaire
Utile
+0
moins plus
Pour afficher avec un arrondi à 3 chiffres après la virgule, ta fonction le fait.

Pour convertir exactement un float ou un double de manière à ce qu'il ait 3 chiffres après la virgule, ça n'existe pas car cela n'a pas de sens. Les flottants sont des approximations des nombres décimaux, ils sont stockés en base 2 et n'auront pas toujours un équivalent en base 10.
Par exemple : 0.2 à une décimale en base 10 mais est approximé 0.20000000298 en float et 0.200000000000000011 en double.

Le code que tu as trouvé cherche une conversion avec N chiffres significatifs, il obtient une approximation qui nécessitera un traitement d'affichage si le résultat a des décimales.
Astrocurieux- 28 nov. 2016 à 22:38
Mince...
Il semblerait je fasse fausse route alors ?

Si il ne s'agit pas d'arrondir mes 3 décimales alors je ne vois pas bien comment obtenir autrement les résultats attendus...

Je vois cela en détails demain.
Je reste en non résolu pour le moment car je risque très certainement d'avoir de nouveaux besoins d'aide.

Merci d'avoir pris le temps de me répondre dalfab.
Bonne soirée.
Répondre
Ajouter un commentaire
Utile
+0
moins plus
Bonjour,
je suis de retour avec toujours la même interrogation ...

ce que je vise =>


ce que j'ai actuellement =>


J'ai corriger les quelques erreurs de calcule qui rester.
je suis toujours certain que je doit arrondir mes résultats au niveau des décimales pour obtenir les chiffre attendue. bien que Dalfab m'explique que c'est pas logique ....
je ne vois pas d'autre issus .

j'aimerais avoir vos avis et ou vos remarques.
merci de votre aide / suivis.
[Dal] 4041Messages postés mercredi 15 septembre 2004Date d'inscription ContributeurStatut 2 décembre 2016 Dernière intervention - 30 nov. 2016 à 19:02
Salut,

Dalfab a dit : "Le code que tu as trouvé cherche une conversion avec N chiffres significatifs, il obtient une approximation qui nécessitera un traitement d'affichage si le résultat a des décimales.", pas que ce que tu veux faire n'est pas logique.

En ce qui me concerne, j'avoue ne pas comprendre quelles sont tes données de départ, sous quelle forme elles existent dans ton programme en C, et ce que tu veux en faire exactement.

Je ne crois pas que tu aies beaucoup plus d'avis ou de remarques sans ce genre de précisions (avec des exemples significatifs)... là pour moi, c'est le flou total


Dal
Répondre
astrocurieux 89Messages postés mardi 24 février 2015Date d'inscription 30 novembre 2016 Dernière intervention - 30 nov. 2016 à 20:52
effectivement vue de l’extérieur ça doit pas être top a comprendre, c'est très simple heureusement : je reçoit en paramètre deux Int ici _A et _B obligatoirement > a 50.

et j'applique un calcule pour obtenir des statistiques.
le calcule c'est celui la : ((a - x) (b - y)) / ((5a - 150) (5b - 150))

voila un peu de code pour y voir plus clair : (_A et _B sont stocker dans ma class Cal)

int Cal::CalcTab()
{
  int X;

for (unsigned int Y = 10; Y < 60; Y++)
  {
    X = 10;
    for (int i = 0; i < 5; i++)
      {
        this->_Tab.push_back(Stati(X, Y));
        X += 10;
      }
    this->_Tab.push_back(CalcTotalY());
    Y += 10;
  }
  CalcTotalX();
  return (DisplayTab());
}

float Cal::Stati(int X, int Y)
{
  float Sup = 0;
  float Inf = 0;

  Sup = (this->_A - X) * (this->_B - Y);
  Inf = ((5 * this->_A) - 150) * ((5 * this->_B) - 150);
  return (Sup / Inf);
}


suite a cela je ne fait que afficher les valeur contenue dans mon vector _Tab une a une pour formé le tableau que vous retrouvé plus haut dans la conversation.
mais même une fois formaté pour afficher 3 décimales je me retrouve avec un décalage de plus en plus grand qui comme vous le voyez fausse mes résultat.

voila tout ...

besoin de plus d'info ou une solution, je suis a votre écoute.
merci.
Répondre
Dalfab 168Messages postés dimanche 7 février 2016Date d'inscription 2 décembre 2016 Dernière intervention - 30 nov. 2016 à 22:26
ligne 5 : y++
ligne 14 : y+=10
donc y augmente de 11 à chaque itération
Répondre
astrocurieux 89Messages postés mardi 24 février 2015Date d'inscription 30 novembre 2016 Dernière intervention - 30 nov. 2016 à 22:52
décidément Dalfab ... tu m'épate.
encore une soirée fini avec le sourire grâce a toi !

merci beaucoup les amis, je passe en résolut.
Répondre
Ajouter un commentaire

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !