sprintf mise en forme de la double valeur
J'ai un problème lors de la conversion double
valeurs à l'aide de la chaîne sprintf()
dans UNIX.
Par exemple, j'ai deux valeurs:
double a = 0.009984354523452;
double b = 0.01;
Lors de la conversion, je suis en utilisant:
sprintf(somestringvar, "Double value : %.15f \n", a);
sprintf(diffstringvar, "Double value : %.15f \n", b);
pour convertir une chaîne de caractères.
Mon problème est pour le "a", la valeur est l'impression correctement, mais pour la valeur de 'b', ' 0 ' sont ajoutés à la fin de la queue. Merci de me fournir toute façon courante de représenter le " a " et " b " comme des valeurs exactes.
Je voudrais utiliser std::ostringstream pour ce genre de chose.
Et, en général, ne pas utiliser de
Salut merci pour les réponses précoces. ostringstream ne prend pas toute la précision. une valeur est l'impression que 0.009976 seulement. Je peux utiliser snprintf() mais le problème est lors de l'impression des valeurs correctement.
Une autre chose que vous devez être au courant: En général, les nombres à virgule flottante pas être représentés exactement parce que la mantisse n'a qu'une longueur finie. E. g.
Il a été de précieux renseignements. C'est vrai que les nombres à virgule flottante ne peut pas être représenté exactement, mais je suis juste essayer d'imprimer les valeurs quelles qu'en soient là, en particulier variable de type double. Suis réellement accès aux données à partir de la base de données, dans ce cas, j'ai l'impression à l'utilisateur exactement que ce qui est là dans la base de données. Mais pas par la "normalisation" ou de "tronquer" ou par "ajoutant des zéros à la queue". Par l'utilisation de %g ou %f ou ostringstream les valeurs sont normalisées et tronquée (comme 0.009984354523452 comme 0.009984) si j'utilise %.20f grandes valeurs sont bien, mais les petits comme 0.01 comme 0.0100..... avec 18 zéros
Et, en général, ne pas utiliser de
sprintf()
, car il peut conduire à des dépassements de mémoire tampon. Utilisation snprintf()
à la place, ou l'un des _s
"safe" versions de Microsoft fournit sous Windows. p.s. Bienvenue à Débordement de Pile!Salut merci pour les réponses précoces. ostringstream ne prend pas toute la précision. une valeur est l'impression que 0.009976 seulement. Je peux utiliser snprintf() mais le problème est lors de l'impression des valeurs correctement.
Une autre chose que vous devez être au courant: En général, les nombres à virgule flottante pas être représentés exactement parce que la mantisse n'a qu'une longueur finie. E. g.
printf("1/10 = %.50f\n", 0.1);
résultats suivants sur ma machine: d = 0.10000000000000000555111512312578270211815834045410
. Vous voudrez peut-être lire sur le représentation à virgule flottante.Il a été de précieux renseignements. C'est vrai que les nombres à virgule flottante ne peut pas être représenté exactement, mais je suis juste essayer d'imprimer les valeurs quelles qu'en soient là, en particulier variable de type double. Suis réellement accès aux données à partir de la base de données, dans ce cas, j'ai l'impression à l'utilisateur exactement que ce qui est là dans la base de données. Mais pas par la "normalisation" ou de "tronquer" ou par "ajoutant des zéros à la queue". Par l'utilisation de %g ou %f ou ostringstream les valeurs sont normalisées et tronquée (comme 0.009984354523452 comme 0.009984) si j'utilise %.20f grandes valeurs sont bien, mais les petits comme 0.01 comme 0.0100..... avec 18 zéros
OriginalL'auteur sandy | 2012-04-26
Vous devez vous connecter pour publier un commentaire.
Vous obtenez des zéros lors de l'impression de b parce que vous avez dit printf imprimer 15 décimales (
%.15f
), et il est docilement faire. Pour obtenir quelque chose "exact", vous pourriez avoir plus de chance avec simple%g
.[Mise à jour sur la base de récents commentaires]
Choses vraiment dépendre de ce que tu veux dire par "exact". Si par exact, tu veux dire "ce que l'utilisateur a saisi", puis un double pourrait ne pas être le meilleur choix pour vous. Peut-être le stockage de la valeur sous forme de chaîne, puis de le convertir en un double lorsque vous avez besoin de l'utiliser dans un calcul. Une fois qu'un texte à base de nombre décimal est converti en double, c'est généralement pas non plus exactement la même chose que le texte. Alors que
printf()
ouostream
seront consciencieusement imprimer exactement ce que le double détient (et parfois il est chanceux et qu'il imprime a la même apparence que la valeur d'origine), le problème est que le double lui-même ne tient plus la réelle valeur d'origine. Et en fait, il ne l'a jamais fait.Sinon, vous pourriez en faveur d'un numérique précise de la mise en œuvre plutôt que quelque chose d'intrinsèquement approximative comme en double. Par exemple, MySQL a NUMERIC et DECIMAL types qui prennent en charge une précision parfaite au coût de la forcer à vous de spécifier le nombre d'entiers et décimaux les lieux à l'avance. Ceci est appelé précision arbitraire et il existe des bibliothèques pour le faire en C/C++.
Pourquoi continuer à voter cela? Si il y a un problème avec elle, parler pour que je puisse l'améliorer ou de fournir une autre réponse de votre propre.
OriginalL'auteur Randall Cook