c ++ std :: stream double values ​​pas de décompte scientifique ni de décompte décimal

Le code suivant affichera les valeurs de a et b:

double a = 3.0, b=1231231231233.0123456; cout.setf(std::ios::fixed); cout.unsetf(std::ios::scientific); cout << a << endl << b << endl 

La sortie est:

 3.000000 1231231231233.012451 

Vous pouvez voir que a est généré avec un nombre fixe de 6 décimales. Mais je veux la sortie comme ceci:

 3 1231231231233.012451 

Comment puis-je définir les indicateurs une seule fois et afficher le résultat ci-dessus?

Le stream insère 0 s après le double car la précision par défaut du stream pour la sortie des valeurs à virgule flottante est de 6. Malheureusement, il n’existe aucun moyen simple de vérifier si le double représente un nombre entier (vous ne pouvez donc imprimer que la partie intégrale). . Ce que vous pouvez faire est toutefois de convertir la valeur en un entier.

 std::cout << static_cast(a); 

La mise en forme par défaut pour les nombres à virgule flottante ne prend pas en charge les formats demandés. Il existe essentiellement trois parameters que vous pouvez utiliser:

  • std::fixed qui utilisera precision() chiffres de precision() après le point décimal.
  • std::scientific qui utilisera la notation scientifique avec une precision() chiffres.
  • std::defaultfloat qui choisira la plus courte des deux formes.

(il existe également std::hexfloat mais cela ne fait que formater le nombre sous une forme facilement lisible par une machine).

Ce que vous pouvez faire est de créer votre propre facette std::num_put qui formate la valeur dans un tampon local à l’aide de std::fixed ce qui std::num_put chiffres avant d’envoyer les valeurs.