Tronquer une valeur décimale en C++
Quelle est la meilleure façon de tronquer une C++ float
variable qui a une valeur de 0.6000002 à une valeur de 0,6000 et de les stocker dans la variable?
OriginalL'auteur BeachRunnerFred | 2008-11-20
Vous devez vous connecter pour publier un commentaire.
Abord, il est important de savoir que les nombres à virgule flottante sont approximatives. Voir le lien donné par @Greg Hewgill à comprendre pourquoi ce problème n'est pas complètement résoluble.
Mais ici, êtes un couple de solutions pour le problème qui va probablement répondre à votre besoin:
Probablement la meilleure méthode, mais de moins en moins efficace:
La façon la plus efficace, mais probablement moins précis:
OriginalL'auteur Brian R. Bondy
Une bonne référence pour pourquoi ce qui se passe peut être trouvé dans Ce Que Tout Informaticien Devriez Savoir Sur L'Arithmétique À Virgule Flottante par David Goldberg.
OriginalL'auteur Greg Hewgill
De façon réaliste, ce n'est pas possible. Ce n'est pas une C++ limitation, mais juste la façon dont virgule flottante œuvres. Pour de nombreuses valeurs il n'y a pas représenter de façon précise, de sorte que vous ne pouvez pas simplement couper un certain nombre de chiffres.
Vous pourriez tronquée lors de l'impression à l'aide de printf chaînes de format.
Si vous avez vraiment besoin pour être en mesure de stocker qu'un nombre limité de chiffres, je vous suggère d'utiliser un fixe de précision type de données à la place.
OriginalL'auteur Kamil Kisiel
je pense que la question qui doit être posée ici est:
Pourquoi avez-vous besoin tronquée?
Si ses pour la comparaison entre les valeurs, peut-être vous devriez envisager d'utiliser l'epsilon de test. (avec un supplément de valeur tolérance, dans votre cas, puisqu'il semble être beaucoup plus important que celui généralement admis epsilon).
Si vous avez juste envie de l'imprimer comme de 0,6000 , utiliser les méthodes d'autres ont suggéré.
OriginalL'auteur Alex Lim
Par exemple, dans votre cas, vous êtes en tronquant les trois chiffres (numDigits). Vous pouvez utiliser:
(Vous auriez probablement stocker le résultat de powf quelque part, puisque vous êtes à l'aide de deux fois.)
En raison de la façon dont les flotteurs sont normalement stockées sur les ordinateurs, il n'y aurait probablement des inexactitudes. C'est ce que vous obtenez pour l'utilisation de flotteurs.
OriginalL'auteur strager
Utiliser ceci:
OriginalL'auteur JBOI
Pour le C++11, vous pouvez utiliser
std::round
défini dans l'en-tête<cmath>
:OriginalL'auteur chema989
Ici est une fonction en utilisant les conseils dans d'autres réponses et un exemple de son utilisation:
OriginalL'auteur David Doria
Similaire à d'autres réponses, MAIS vous ne devez pas oublier que ronde, le plancher et le tronc sont différents de par leur définition. Voir la définition et exemple de sortie de la suivante:
http://www.cplusplus.com/reference/cmath/trunc/
Dans ce cas, nous avons besoin de trucate avec une précision de 4 décimales et de se débarrasser de non-significative décimales:
ou
OriginalL'auteur Rubarb