éviter le 2e+10 en c++ [Résolu]

Signaler
Messages postés
366
Date d'inscription
mardi 28 juin 2016
Statut
Membre
Dernière intervention
18 mars 2018
-
Messages postés
366
Date d'inscription
mardi 28 juin 2016
Statut
Membre
Dernière intervention
18 mars 2018
-
Bonjour,
Je voudrai savoir si il est possible d'éviter (dans un int, double, float, ....) les chiffres comme 2e+10 et de le mettre dans la console (un peu comme la calculatrice Windows, par exemple)? Merci d'avance

4 réponses

Messages postés
3839
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 avril 2021
121
Bonjour.

Il ne faut pas confondre un nombre et sa représentation. Un nombre aura toujours la même valeur ('a' == 97 == 0x61 == 9.7e+1). Ce qui va changer c'est la représentation, c'est-à-dire la manière dont tu vas afficher une valeur. Pour reprendre l'exemple du 'a', on peut le représenter sous forme de caractère, sous forme entière, sous forme scientifique, sous forme hexadécimale, etc...

Donc ici, tu veux un moyen de manipuler l'affichage de ta valeur. En C++, on fait cela en s'aidant des outils suivants:

En jouant avec ces trois notions, on a un contrôle assez précis de l'affichage final. Exemple:
#include <iostream>
#include <iomanip>

int main()
{
  // Je veux afficher 2e+10 sous la forme 20000000000
  // J'impose donc un format "entier" (std::fixed) et pas de nombre après la virgule (std::setprecision(0) + std::noshowpoint)
  std::cout << std::fixed << std::noshowpoint << std::setprecision(0) << 2e+10 << std::endl;
  return 0;                                                                                 
}



Améliorer votre expérience CodeS-SourceS avec ce plugin:
http://codes-sources.commentcamarche.net/forum/affich-10000111-plugin-better-cs-2#cptpingu-signature
Messages postés
366
Date d'inscription
mardi 28 juin 2016
Statut
Membre
Dernière intervention
18 mars 2018

Merci de ta réponse complète mais : lorsque je l'utilise (à la place de 2e+10, je met une variable) et que je met le numéro (genre 100000000000000) il me rajoute des numéros (ce qui donne 100000000025891) sans que je l'ai demandé. J'ai ensuite regardé ton lien ( http://en.cppreference.com/w/cpp/io/manip/fixed ) et j'ai remarqué qu'il n'y avait pas de variable, mais juste des "valeurs". Je sais que j'ai demandé une mauvaise question parce que j'ai confondu. Donc, je me pose la question :

comment éviter les résultats comme 2e+10 avec des variables (int, float,...) ?
Messages postés
3839
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 avril 2021
121
Rien à voir... Une variable ou une valeur, c'est traité pareil ! Une variable contient une valeur. Les règles de manipulation qui sont appliquées sont strictement identiques.

Ton problème vient d'ailleurs. C'est un problème de précision. Quand on veut utiliser un nombre à virgule on utilise un double. Le float est "vieux" type trop petit, qui manque de précision. Historiquement, on l'utilisait parce que c'est plus rapide qu'un double (on parle de quelques nanosecondes), et que ça prend moins de place en mémoire. De nos jours, à moins d'être certain de ce que l'ont fait, on utilisera toujours un double plutôt qu'un float.

#include <iostream>
#include <iomanip>

int main()
{
  // Je veux afficher 2e+10 sous la forme 20000000000
  // J'impose donc un format "entier" (std::fixed) et pas de nombre après la virgule (std::setprecision(0) + std::noshowpoint)
  std::cout << std::fixed << std::noshowpoint << std::setprecision(0) << 2e+10 << std::endl;

  float sf = 100000000000000;
  std::cout << sf << std::endl; // Affichera une valeur arrondie

  double df = 100000000000000;
  std::cout << df << std::endl; // Affichera la bonne valeur

  std::cout << 100000000000000 << std::endl; // Affichera la bonne valeur, car le compilateur détecte que c'est un double

  return 0;
}

Messages postés
366
Date d'inscription
mardi 28 juin 2016
Statut
Membre
Dernière intervention
18 mars 2018

D'accord !

Et maintenant j'ai compris pourquoi ça rajoute des valeurs : un double (et autre variables) sont limitées à un certains nombres et comme je les aient dépassés ça bug.
Merci de ton aide