Le float
le plus proche de 1.400000
est légèrement inférieur à 1.4
. Vous pouvez vérifier que en faisant
printf("%0.8hf\n", floatingPart);
Le résultat de ideone est 1.39999998
. Cela signifie que 10 fois le premier chiffre après la virgule est 3
.
Pour éviter ce problème, utilisez l'arrondi au lieu de la troncature. Un moyen facile d'arrondir est en ajoutant la moitié avant troncature:
printf("%d", (int)(numberForFactorial + 0.5f));
imprimera 4
que vous attendiez. Vous pouvez également utiliser round
, rint
, lround
ou modf
pour obtenir le même résultat: https://www.gnu.org/software/libc/manual/html_node/Rounding-Functions.html. L'arrondi est un sujet complexe, alors choisissez la méthode dont les contraintes correspondent le mieux à votre situation.
Probablement parce que '1.40000' est stocké en interne sous la forme' 1.399999' ou quelque chose comme ça. '(int) 3.99999' est' 3', comme prévu. –
Qu'est-ce que vous obtenez lorsque vous faites 'printf ("% 0.6f \ n ", floatingPart);'? –
Pour développer le commentaire de @ MadPhysicist, la conversion d'un nombre à virgule flottante en nombre entier est tronquée vers zéro. –