Expressions à virgule flottante C# : comportement inattendu lors de la conversion de flottant en nombre entier
En C#, un comportement inattendu peut se produire lors de la conversion du résultat d'une expression à virgule flottante en un entier. Considérez le 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 contenir la même valeur. Cependant, le résultat réel est :
<code>speed1 = 61 speed2 = 62</code>
Cette anomalie découle de l'ordre des opérations effectuées. Dans speed1, le résultat de la multiplication (6,2f * 10) est immédiatement converti en un entier, ce qui donne une valeur tronquée de 61.
En revanche, dans speed2, le résultat de la multiplication est attribué à tmp sous forme de nombre à virgule flottante, déclenchant l'arrondi lors de la conversion implicite en virgule flottante. Cette valeur arrondie de 62 est ensuite convertie en un nombre entier, ce qui donne le résultat correct.
Pour comprendre ce comportement, il est important de réaliser que les nombres à virgule flottante (comme 6.2f) ne sont pas des valeurs mathématiques exactes, mais des approximations. Par conséquent, les opérations arithmétiques sur les nombres à virgule flottante peuvent entraîner une perte de précision due aux arrondis.
Dans le cas de (int)(6.2f 10) , le compilateur peut (éventuellement) conserver la précision de 6.2f 10 même si le résultat est formellement un nombre à virgule flottante. Cela permet d’obtenir des résultats plus précis. Cependant, si cette optimisation n'est pas implémentée, l'expression sera convertie en un nombre à virgule flottante double précision, entraînant éventuellement une perte de précision.
En revanche, l'affectation à tmp = 6.2f * 10 force explicitement l'arrondi avant la conversion des nombres entiers. Cela garantit des résultats cohérents sur différents systèmes.
Par conséquent, pour éviter de telles exceptions, il est généralement recommandé d'utiliser une fonction d'arrondi explicite, telle que Math.Round, lors de la conversion de nombres à virgule flottante en nombres entiers.
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!