variable de conversion en fonction int vs round ()

Je l’ai vu à plusieurs endroits où (int)someValue était inexact et le problème appelé à la fonction round() . Quelle est la différence entre les deux?

Plus précisément, si besoin est, pour C99 C. J’ai également constaté le même problème dans mes programmes lors de leur écriture en java.

En cas de transtypage d’une valeur float / double sur int , vous perdez généralement la partie fractionnaire en raison d’une troncature d’entier .

Ceci est assez différent de l’arrondi attendu normalement. Ainsi, par exemple, 2.8 se termine par 2 avec une troncature d’entier, tout comme 2.1 se termine par 2.

Mise à jour :

Une autre source d’inexactitude (brute) potentielle avec la transtypage est due au nombre limité de valeurs pouvant être représentées avec des entiers et non avec des types à virgule flottante (merci à @R de nous le rappeler dans le commentaire ci-dessous)

  1. Le transtypage vers int tronque un nombre à virgule flottante, c’est-à-dire qu’il supprime la partie décimale.
  2. La fonction round renvoie l’entier le plus proche. Les cas à mi-chemin sont arrondis à zéro, par exemple, round(-1.5) est égal à -2 et round(1.5) est égal à 2 .

7.12.9.6 Les fonctions du tour

Synopsis

 #include  double round(double x); float roundf(float x); long double roundl(long double x); 

La description

Les fonctions d’arrondi arrondissent leur argument à la valeur entière la plus proche sous forme de virgule flottante, en arrondissant les demi-casse à zéro, quel que soit le sens d’arrondi actuel.

Résultats

Les fonctions round renvoient la valeur entière arrondie.

Source: norme C99 ( ISO / IEC 9899: 1999 ). Cette section n’a pas changé dans la norme C11 ( ISO / IEC 9899: 2011 ).

(Pour ceux qui sont intéressés, voici une introduction claire aux algorithmes d’arrondi.)

En particulier pour C, il est (probablement) vrai dans la plupart des cas que la conversion se tronque, mais vous devez toujours tester le résultat pour en être sûr.

Le problème avec le casting est qu’il peut soit tronquer OU arrondir. Ce que cela fait dépend en grande partie du langage de programmation, légèrement du compilateur utilisé. Ce qui signifie qu’il n’y a pas de règle générale pour le résultat qui s’appliquera toujours.

Round () est utilisé universellement pour générer un résultat similaire à l’arrondi mathématique. Il y a un cas limite qui doit être surveillé spécifiquement pour .5, qui arrondit parfois au nombre pair suivant.