Maison > développement back-end > C++ > Pourquoi la conversion d'une expression flottante C# en Int produit-elle des résultats inattendus ?

Pourquoi la conversion d'une expression flottante C# en Int produit-elle des résultats inattendus ?

Patricia Arquette
Libérer: 2025-01-08 17:12:46
original
586 Les gens l'ont consulté

Why Does Casting a C# Float Expression to an Int Produce Unexpected Results?

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>
Copier après la connexion

Intuitivement, speed1 et speed2 devraient contenir la même valeur. Cependant, le résultat réel est :

<code>speed1 = 61
speed2 = 62</code>
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal