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