Maison >développement back-end >C++ >Pourquoi les conversions directes et les affectations de variables d'expressions flottantes C# donnent-elles des résultats entiers différents ?
Comportement inhabituel de la conversion de virgule flottante C# en nombre entier : différence entre la conversion directe et l'affectation de variable
En C#, les développeurs rencontrent souvent un comportement étrange lors de la conversion du résultat d'une expression à virgule flottante en un entier. Par exemple, considérons l'extrait de code suivant :
<code class="language-csharp">int speed1 = (int)(6.2f * 10); float tmp = 6.2f * 10; int speed2 = (int)tmp;</code>
Intuitivement, speed1 et speed2 devraient avoir la même valeur. Or, ce n’est pas le cas : speed1 est égal à 61 et speed2 est égal à 62.
Explication des différences
La cause fondamentale réside dans la différence subtile entre la conversion directe et l'affectation de variables. Dans le cas de speed1, l'expression 6.2f * 10 donne une valeur à virgule flottante de 61,999998. Lorsqu'elle est implicitement convertie en nombre entier, cette valeur est tronquée à 61.
D'autre part, la variable tmp stocke explicitement une valeur à virgule flottante de 61,999998. Lorsqu'elle est explicitement convertie en nombre entier, cette valeur est arrondie à l'entier le plus proche, ce qui donne 62.
Précision intermédiaire
Cette différence devient encore plus intéressante lors de l'analyse du bytecode généré par le compilateur. Dans le premier cas, l'expression 6,2f * 10 devient directement la valeur intermédiaire. Dans le second cas, le compilateur stocke le résultat dans une variable à virgule flottante, créant ainsi une étape intermédiaire.
Cette différence de stockage intermédiaire affecte la précision du résultat final. Le compilateur permet d'utiliser des valeurs intermédiaires de plus haute précision, même si le type formel (float) implique le contraire. Dans certains cas où le compilateur fait cela, le résultat peut être tronqué à 61, provoquant la différence observée.
Comment éviter ce problème
Pour assurer la cohérence dans ces cas, il est recommandé d'arrondir explicitement les expressions à virgule flottante avant de les convertir en nombres entiers, comme dans l'exemple suivant :
<code class="language-csharp">int speed3 = (int)Math.Round(6.2f * 10);</code>
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!