C ++ printf Arrondir?

Mon code:

// Convert SATOSHIS to BITCOIN static double SATOSHI2BTC(const uint64_t& value) { return static_cast(static_cast(value)/static_cast(100000000)); } double dVal = CQuantUtils::SATOSHI2BTC(1033468); printf("%f\n", dVal); printf("%s\n", std::to_ssortingng(dVal).data()); 

Sortie Google: 0.01033468

Sortie du programme: 0.010335 pour printf et std::to_ssortingng

Sortie du débogueur: 0.01033468

Est-ce que printf et std::to_ssortingng arrondissent le nombre? Comment puis-je obtenir une chaîne avec la valeur appropriée?

C’est un peu délicat avec la largeur du champ

 #include  #include  #include  #include  #include  #include  #define INV_SCALE 100000000 static const int WIDTH = std::ceil( std::log10(std::numeric_limits::max()) ) + 1 /* for the decimal dot */; static const uint64_t INPUT = 1033468; static const double DIVISOR = double(INV_SCALE); static const int PREC = std::ceil(std::log10(DIVISOR)); static const double DAVIDS_SAMPLE = 1000000.000033; namespace { std::ssortingng to_ssortingng(double d, int prec) { std::ssortingngstream s; s << std::fixed << std::setw(WIDTH) << std::setprecision(prec) << d; // find where the width padding ends auto start = s.str().find_first_not_of(" "); // and trim it left on return return start != std::string::npos ? &(s.str().c_str()[start]) : "" ; } } int main() { for (auto& s : {to_string(INPUT/DIVISOR, PREC), to_string(DAVIDS_SAMPLE, 6)} ) std::cout << s << std::endl; return /*EXIT_SUCCESS*/ 0; } 

sortie:

 0.01033468 1000000.000033 

La fonction std::to_ssortingng utilise la même notation qu’avec printf :

7,8) Convertit une valeur en virgule flottante en une chaîne ayant le même contenu que ce que std::sprintf(buf, "%f", value) produirait pour un buf suffisamment grand.

La documentation de printf montre:

Précision spécifie le nombre minimum de chiffres à afficher après le caractère décimal. La précision par défaut est 6.

Vous pouvez utiliser %.32f pour indiquer le nombre de décimales souhaité (par exemple 32):

 printf("%.32f\n", dVal); 

Je ne trouve pas de moyen de changer le nombre de décimales avec to_ssortingng , mais vous pouvez imprimer la valeur sur une chaîne avec sprintf :

 char buffer [100]; sprintf (buffer, "%.32f", dVal); printf ("%s\n",buffer); 

Et si vous voulez un std::ssortingng :

 std::ssortingng strVal(buffer); 

Merci à toutes les réponses,

cela a rendu l’astuce:

 std::ssortingngstream ss; ss << std::setprecision(8) << dVal; std::string s = ss.str(); printf("ss: %s\n", s.data()); 

Sortie:

ss: 0.01033468