2012-03-20 3 views
2

J'ai donc un CString qui contient une valeur numérique, par ex. "45.05" et je voudrais arrondir ce nombre à une décimale.Arrondir une valeur contenue dans un CString

J'utilise cette funcion

_stscanf(strValue, _T("%f"), &m_Value); 

pour mettre la valeur dans un flotteur qui je peux arrondir. Cependant dans le cas de 45.05 le nombre que j'obtiens est 45.04999 ... qui arrondit à 45.0 où l'on s'attendrait 45.1

Comment est-ce que je peux obtenir la valeur correcte de mon CString?

TIA

+0

Appelez-vous une fonction ceil sur la valeur? Ou est-ce que strValue a 45.0499 après avoir appelé le _stscanf? – Gangadhar

+0

m_Value a 45.04999 après avoir appelé –

+0

C'est à cause de la représentation en virgule flottante en binaire. S'il vous plaît lire ceci pour savoir pourquoi cela se produit - http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html ou ce http://floating-point-gui.de/basic/. Longue histoire courte, pour les valeurs à virgule flottante, ne vous attendez pas à ce que la valeur exacte soit disponible - il y a une petite différence entre la valeur prévue et la valeur réelle. – Gangadhar

Répondre

2

Si vous avez besoin d'un résultat de chaîne, votre meilleur pari est de trouver le point décimal et inspecter les deux chiffres après et les utiliser pour faire un résultat arrondi. Si vous avez besoin d'un nombre à virgule flottante, eh bien ... c'est sans espoir puisque 45.1 ne peut pas être représenté exactement.

EDIT: le plus proche, vous pouvez venir à arrondir avec arithmétique est de calculer floor(x*10+0.5)/10, mais sachez que cela faisant 45.05 ne sera pas et ne peut pas entraîner 45.1.

+0

C'est ce que je craignais. Merci de votre aide. –

0

Je n'ai pas utilisé C++ depuis un moment mais voici les étapes que je prendrais.

  1. compter les caractères après la virgule
  2. Supprimer la décimale
  3. jeté la chaîne à une Int
  4. Effectuer arrondi opération
  5. diviser par le (nombre de caractères moins un) * 10
  6. Enregistrer le résultat dans un flotteur
1

Vous pouvez extraire les chiffres qui vous font p les centièmes et les positions inférieures séparément, les convertir en un nombre et arrondir indépendamment, puis ajouter cela au reste du nombre:

"45,05" = 45,0 et 0,5 dixièmes (0,5 peut être représenté exactement en binaire)

ronde 0,5 dixièmes à 1

45,0 + 1 dixième = 45,1

ne confondez pas avec la manipulation juste la position fractionnaire séparément. "45.15" n'est pas divisé en 45 et .15, il est divisé en 45.1 et 0.5 dixièmes.

Questions connexes