Heim >Backend-Entwicklung >C++ >Warum führt die Umwandlung eines C#-Float-Ausdrucks in einen Int zu unerwarteten Ergebnissen?

Warum führt die Umwandlung eines C#-Float-Ausdrucks in einen Int zu unerwarteten Ergebnissen?

Patricia Arquette
Patricia ArquetteOriginal
2025-01-08 17:12:46639Durchsuche

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

C#-Gleitkommaausdrücke: Unerwartetes Verhalten bei der Konvertierung von Gleitkommazahlen in Ganzzahlen

In C# kann es zu unerwartetem Verhalten kommen, wenn das Ergebnis eines Gleitkommaausdrucks in eine Ganzzahl umgewandelt wird. Betrachten Sie den folgenden Code:

<code class="language-csharp">int speed1 = (int)(6.2f * 10);
float tmp = 6.2f * 10;
int speed2 = (int)tmp;</code>

Intuitiv sollten Geschwindigkeit1 und Geschwindigkeit2 denselben Wert enthalten. Das tatsächliche Ergebnis ist jedoch:

<code>speed1 = 61
speed2 = 62</code>

Diese Anomalie ergibt sich aus der Reihenfolge der durchgeführten Vorgänge. In Geschwindigkeit 1 wird das Ergebnis der Multiplikation (6,2f * 10) sofort in eine Ganzzahl umgewandelt, was zu einem abgeschnittenen Wert von 61 führt.

Im Gegensatz dazu wird in speed2 das Multiplikationsergebnis tmp als Gleitkommazahl zugewiesen, wodurch bei der impliziten Konvertierung in Gleitkomma eine Rundung ausgelöst wird. Dieser gerundete Wert von 62 wird dann in eine Ganzzahl umgewandelt, was zum korrekten Ergebnis führt.

Um dieses Verhalten zu verstehen, ist es wichtig zu erkennen, dass Gleitkommazahlen (wie 6.2f) keine exakten mathematischen Werte, sondern Näherungen sind. Daher kann es bei arithmetischen Operationen mit Gleitkommazahlen zu einem Genauigkeitsverlust aufgrund von Rundungen kommen.

Im Fall von (int)(6.2f 10) kann der Compiler (optional) die Genauigkeit von 6.2f 10 beibehalten, obwohl das Ergebnis formal eine Gleitkommazahl ist. Dies ermöglicht genauere Ergebnisse. Wenn diese Optimierung jedoch nicht implementiert wird, wird der Ausdruck in eine Gleitkommazahl mit doppelter Genauigkeit umgewandelt, was möglicherweise zu einem Genauigkeitsverlust führt.

Im Gegensatz dazu erzwingt die Zuweisung zu tmp = 6.2f * 10 explizit das Runden vor der Ganzzahlkonvertierung. Dies stellt konsistente Ergebnisse über verschiedene Systeme hinweg sicher.

Um solche Ausnahmen zu vermeiden, wird daher generell empfohlen, bei der Konvertierung von Gleitkommazahlen in Ganzzahlen eine explizite Rundungsfunktion wie Math.Round zu verwenden.

Das obige ist der detaillierte Inhalt vonWarum führt die Umwandlung eines C#-Float-Ausdrucks in einen Int zu unerwarteten Ergebnissen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn