HOWTO · C++

Wie man einen Float in C++ in einen Int konvertiert

Dieser Artikel führt ein, wie man einen Float in C++ in einen Int konvertiert.

Auf dieser Seite

Um einen C++-float in einen int zu konvertieren und seinen Nachkommateil zu verwerfen, verwenden Sie static_cast<int>(value). Eine Konvertierung von Gleitkomma zu Ganzzahl schneidet in Richtung null ab: 4.8f wird zu 4, während -4.8f zu -4 wird. Wenn Sie eine andere Rundungsregel benötigen, wählen Sie vor der Konvertierung eine Funktion aus <cmath>.

Direkte Zuweisung verwenden, um Float in Int zu konvertieren

Die direkte Zuweisung konvertiert einen float implizit in einen int. Der Nachkommateil wird verworfen. Hier ist ein kompaktes Programm, das einen vertrauten Wert zuweist und die konvertierte ganze Zahl anzeigt:

#include <iostream>

int main() {
    float value = 4.8f;
    int result = value;

    std::cout << result << '\n';
}

Die C++-Konvertierungssemantik ergibt für 4.8f den ganzzahligen Wert 4. Das Beispiel gibt aus:

4

Bei negativen Eingaben bewegt sich das Abschneiden weiterhin in Richtung null, sodass -4.8f in -4 konvertiert wird und nicht in den Floor-Wert -5.

C-Style-Cast verwenden, um Float in Int zu konvertieren

Ein C-Style-Cast schreibt den Zieltyp in Klammern, wie in int result = (int)value;. Für einen skalaren Gleitkommawert erzeugt er dasselbe Ergebnis des Abschneidens in Richtung null wie die direkte Zuweisung und static_cast<int>(value), vorausgesetzt, der konvertierte Wert ist als int darstellbar.

C-Style-Casts können mehrere Arten von Konvertierungen ausdrücken, sodass ihre Wirkung auf einen Blick weniger explizit ist. Bevorzugen Sie in modernem C++ static_cast<int>(value), wenn dies die beabsichtigte Konvertierung ist. Die C-Style-Schreibweise bleibt nützlich, um sie in vorhandenem Code zu erkennen, aber sie ändert nicht, wie ein Gleitkommawert abgeschnitten wird.

static_cast verwenden, um Float in Int zu konvertieren

Verwenden Sie static_cast<int>(value), um die Konvertierung explizit zu machen und ihren Zieltyp zu identifizieren. Für einen Gleitkommawert schneidet static_cast in Richtung null ab; es rundet nicht auf die nächste ganze Zahl und prüft auch nicht, ob das Ergebnis in einen int passt.

Die Konvertierung hat undefiniertes Verhalten, wenn der abgeschnittene Wert nicht durch int dargestellt werden kann. Zu prüfen, ob der ursprüngliche Wert vor der Konvertierung innerhalb der Grenzen von int liegt, ist ein konservativer Schutz: Er kann einige Bruchwerte ablehnen, deren abgeschnittenes Ergebnis noch passen würde. static_cast klemmt oder validiert den Wert nicht. Siehe die static_cast-Referenz für die Sprachregeln und andere von diesem Operator unterstützte Konvertierungen.

Rundungsstrategien verwenden, um Float in Int zu konvertieren

Wählen Sie eine Rundungsfunktion, wenn das Abschneiden in Richtung null nicht das gewünschte Ergebnis ist. Inkludieren Sie <cmath> und wenden Sie die Funktion an, bevor Sie ihr Ergebnis in int konvertieren. Der gerundete Wert muss ebenfalls als int darstellbar sein.

Abrunden (Floor)

std::floor(value) gibt den größten ganzzahligen Wert zurück, der kleiner oder gleich der Eingabe ist. Zum Beispiel ergibt floor 4 für 4.8f und -5 für -4.8f. Dies unterscheidet sich von der direkten Konvertierung in int, die 4 bzw. -4 ergibt. Um ein floor-Ergebnis als ganze Zahl zu speichern, verwenden Sie static_cast<int>(std::floor(value)), nachdem Sie sichergestellt haben, dass es im gültigen Bereich liegt.

Aufrunden (Ceil)

std::ceil(value) gibt den kleinsten ganzzahligen Wert zurück, der größer oder gleich der Eingabe ist. Es ergibt 5 für 4.8f und -4 für -4.8f. Konvertieren Sie dieses Ergebnis mit static_cast<int>(std::ceil(value)), wenn eine ganze Zahl benötigt wird und das Ergebnis in einen int passt.

Auf die nächste ganze Zahl runden

std::round(value) wählt den nächsten ganzzahligen Wert, wobei Fälle genau in der Mitte von null weg gerundet werden. So ist std::round(4.5f) gleich 5, und std::round(-4.5f) ist -5. Verwenden Sie static_cast<int>(std::round(value)), um eine ganze Zahl zu erhalten, und prüfen Sie wiederum, ob das gerundete Ergebnis darstellbar ist. Diese Regel unterscheidet sich vom Abschneiden, floor und ceil, insbesondere bei negativen Eingaben.

Fazit

Für die gewöhnliche Konvertierung von Float zu Int macht static_cast<int>(value) die Absicht klar und schneidet in Richtung null ab. Die direkte Zuweisung und ein C-Style-Cast haben für geeignete Werte dasselbe Abschneideverhalten, aber der benannte Cast ist leichter als bewusste C++-Konvertierung zu erkennen. Verwenden Sie std::floor, std::ceil oder std::round aus <cmath>, wenn ihre jeweiligen Rundungsregeln zur Aufgabe passen. Stellen Sie vor jeder Konvertierung sicher, dass der durch Abschneiden oder Runden erzeugte Wert in den Bereich von int passt; keiner dieser Casts prüft oder passt ihn für Sie an.