Inverser un numéro à cinq chiffres avec fonction de prisonnier de guerre en C

J’ai un exercice qui demande un programme qui retourne un nombre à cinq chiffres en utilisant pow, voici mon essai

#include  #include  void main( void ) { int number, counter = 0, last_digit, reversed = 0; printf( "Please type a five digit number and I will reverse it\n" ); scanf( "%d", &number ); for( counter = 4; counter >= 0; counter-- ) { last_digit = number % 10; number = number / 10; //printf( "%d %d %.0f %.0f\n\n", reversed, last_digit, pow ( 10, counter ), reversed + last_digit * pow( 10, counter )); reversed = reversed + last_digit * pow( 10, counter ); }//end for printf( "The number reversed is %d", reversed ); }//end main 

Mais si je tape 12345, il renvoie 54320, le dernier chiffre est faux! Pour vérifier ce qui se passait, j’ai activé le commentaire printf et voici un exemple d’exécution:

 Please type a five digit number and I will reverse it 12345 0 5 10000 50000 49999 4 1000 53999 53999 3 100 54299 54299 2 10 54319 54319 1 1 54320 The number reversed is 54320 

Pour une raison quelconque, le premier 50000 est converti en 49999, il y en a un de moins! Et ce qui est étrange, c’est que cela ne se produit que la première fois. Par exemple, 53999 est correctement converti en 53999. Que se passe-t-il ici?

Comme l’ont dit les autres commentateurs, le problème est l’arrondi. pow() renvoie un double et pow(10,4) doit renvoyer un double proche de 10 000 mais un peu ou deux. Ensuite, dans votre instruction print, lorsque vous imprimez une version reversed + last_digit * pow( 10, counter ) , cette valeur correspond à un double, proche de 50000, mais légèrement plus faible. Lorsqu’il imprime, printf arrondit à la précision avec laquelle vous l’imprimez. Il est alors imprimé sous la forme 50000. Mais lorsque vous atsortingbuez à l’entier reversed , la valeur est tronquée et, si elle se situe même un bit en dessous de 50000, elle devient 49999. Votre enseignant a conçu une très belle question – enseigne bien!

Vous pouvez utiliser round (pow (10, counter))