Afficher des float sous un format specifique

Résolu/Fermé
Utilisateur anonyme - 28 nov. 2016 à 19:11
 Utilisateur anonyme - 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.


3 réponses

Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
28 nov. 2016 à 20:32
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
0
Utilisateur anonyme
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 !
0
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
28 nov. 2016 à 22:18
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.
0
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.
0
Utilisateur anonyme
29 nov. 2016 à 17:18
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.
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié par [Dal] le 30/11/2016 à 19:03
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
0
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.
0
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101 > Utilisateur anonyme
30 nov. 2016 à 22:26
ligne 5 : y++
ligne 14 : y+=10
donc y augmente de 11 à chaque itération
0
Utilisateur anonyme
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.
0