2015-08-26 3 views
1

Je travaille sur un problème C++ qui devrait produire 22258199.5000000 ce nombre, j'ai stocké le résultat dans le double type de données et quand j'ai essayé d'imprimer cette variable en utilisant std :: cout il arrondit à 22258200.0000000, je ne sais pas pourquoi cela arrive? quelqu'un peut-il expliquer? que puis-je faire pour éviter ce problème?Comment éviter l'arrondi de grandes valeurs flottantes ou doubles?

+2

S'il vous plaît ** [modifier] ** votre question avec un [mcve] ou [SSCCE (court, autonome, exemple correct)] (http://sscce.org) – NathanOliver

+4

Vous utilisez presque certainement un 'float 'type, conversion ou constante quelque part - c'est la valeur de simple précision la plus proche de l'original. –

+2

Utiliser cout avec précision définie à 15 chiffres significatifs: une bonne règle pour un double virgule flottante. Si vous utilisez un «float», vous n'avez pas de chance. – Bathsheba

Répondre

3

Un type 32 bits float contient environ 7 chiffres décimaux, et tout ce qui dépasse est arrondi à la valeur représentable la plus proche.

Un type double 64 bits contient environ 15 chiffres décimaux et arrondit également les valeurs au-delà.

Étant donné que votre valeur est arrondie au nombre à 7 chiffres le plus proche, il semble que vous utilisiez une variable float quelque part. La copie d'une valeur float à double ne restaure pas les chiffres perdus. Ceci ne s'applique pas à votre exemple, mais peut-être à d'autres - l'arrondi se produit en binaire, pas en décimal, de sorte que vous pourriez vous retrouver avec une valeur qui semble contenir beaucoup plus de chiffres que je l'ai indiqué ci-dessus. Sachez que seuls les 7 ou 15 premiers seront précis en décimal.

+0

J'ai trouvé le problème, c'était le flux cout qui causait le problème, je n'utilisais que le double mais il s'est arrondi lors de l'impression en utilisant cout. J'ai mis la précision en utilisant cout.precision (15) et ça a bien fonctionné. –