Comportement inhabituel de la conversion C# float en entier
L'extrait de code suivant démontre un comportement inattendu de la conversion de virgule flottante en nombre entier en C# :
<code class="language-csharp">int speed1 = (int)(6.2f * 10); float tmp = 6.2f * 10; int speed2 = (int)tmp;</code>
Étonnamment, speed1
a une valeur de 61, tandis que speed2
a une valeur de 62, même si tous deux s'attendent à ce que le résultat soit de 62. Une inspection minutieuse révèle que dans speed1
l'expression à virgule flottante 6.2f * 10
est implicitement convertie en type double
avant d'être tronquée en un entier, ce qui donne un résultat de 61.
Cependant, dans speed2
, le résultat de 6.2f * 10
est explicitement affecté à la variable float
tmp
. Cette étape intermédiaire consiste à arrondir la valeur à la valeur float
la plus proche, soit 62, puis à la convertir en nombre entier.
La principale différence entre les deux opérations est la représentation intermédiaire. Dans le premier cas, le compilateur peut choisir de réserver une représentation de plus grande précision pour l'expression à virgule flottante, provoquant une troncature et donnant une valeur de 61. Cependant, dans le deuxième cas, l'affectation explicite float
force l'arrondi, ce qui donne une valeur de 62.
Dans les actions suivantes :
<code class="language-csharp">double d = 6.2f * 10; int tmp2 = (int)d;</code>
d
sera de type double
, provoquant la conversion de double
et la valeur arrondie tronquée en un entier, ce qui donne généralement une valeur de 62.
Un comportement inattendu dans les conversions d'expressions à virgule flottante est un aspect subtil de la gestion des virgules flottantes en C#. Comprendre cette nuance est essentiel pour éviter des résultats inattendus et garantir des conversions précises entre les types numériques.
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!