HOWTO · C++

如何在 C++ 中將 float 轉換為 int

本文介紹了如何在 C++ 中將 float 轉換為 int。

本頁內容

要將 C++ 的 float 轉換為 int 並捨棄其小數部分,請使用 static_cast<int>(value)。浮點數到整數的轉換會向零截斷:4.8f 變為 4,而 -4.8f 變為 -4。如果需要不同的捨入規則,請在轉換之前從 <cmath> 中選擇一個函式。

使用直接賦值將 float 轉換為 int

直接賦值會隱式地將 float 轉換為 int。小數部分會被捨棄。下面是一個簡潔的程式,它賦予一個熟悉的值並顯示轉換後的整數:

#include <iostream>

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

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

C++ 的轉換語義為 4.8f 給出整數值 4。該範例輸出:

4

對於負數輸入,截斷仍然向零移動,因此 -4.8f 會轉換為 -4,而不是向下取整值 -5。

使用 C 風格強制轉換將 float 轉換為 int

C 風格強制轉換將目標型別寫在括號中,如 int result = (int)value;。對於純量浮點值,只要轉換後的值可以表示為 int,它就會產生與直接賦值和 static_cast<int>(value) 相同的向零截斷結果。

C 風格強制轉換可以表達多種類型的轉換,因此其效果乍看之下不夠明確。在現代 C++ 中,當這正是你想要的轉換時,請優先使用 static_cast<int>(value)。C 風格寫法在現有程式碼中仍然有助於識別,但它不會改變浮點值的截斷方式。

使用 static_cast 將 float 轉換為 int

使用 static_cast<int>(value) 使轉換變得明確,並標識其目標型別。對於浮點值,static_cast 會向零截斷;它不會捨入到最接近的整數,也不會檢查結果是否能放入 int 中。

如果截斷後的值無法由 int 表示,則該轉換的行為是未定義的。在轉換之前檢查原始值是否在 int 的限制範圍內是一種保守的防護:它可能會拒絕一些截斷結果本可以放得下的小數值。static_cast 不會鉗制或驗證該值。有關語言規則以及該運算子支援的其他轉換,請參閱 static_cast 參考。

使用捨入策略將 float 轉換為 int

當向零截斷不是期望的結果時,請選擇一個捨入函式。包含 <cmath>,並在將其結果轉換為 int 之前套用該函式。捨入後的值也必須可以表示為 int。

向下捨入(Floor)

std::floor(value) 傳回小於或等於輸入的最大整數值。例如,floor 對 4.8f 給出 4,對 -4.8f 給出 -5。這與直接轉換為 int 不同,後者分別給出 4 和 -4。要將 floor 結果儲存為整數,請在確保其在範圍內之後使用 static_cast<int>(std::floor(value))。

向上捨入(Ceil)

std::ceil(value) 傳回大於或等於輸入的最小整數值。它對 4.8f 給出 5,對 -4.8f 給出 -4。當需要整數且結果能放入 int 時,使用 static_cast<int>(std::ceil(value)) 轉換該結果。

捨入到最接近的整數

std::round(value) 選擇最接近的整數值,中間情況則遠離零捨入。因此 std::round(4.5f) 為 5,std::round(-4.5f) 為 -5。使用 static_cast<int>(std::round(value)) 取得整數,並再次檢查捨入結果是否可表示。此規則與截斷、floor 和 ceil 不同,尤其對於負數輸入。

結論

對於普通的 float 到 int 轉換,static_cast<int>(value) 使意圖清晰,並向零截斷。直接賦值和 C 風格強制轉換對於合適的值具有相同的截斷行為,但命名強制轉換更容易被識別為有意的 C++ 轉換。當各自的捨入規則與任務相符時,請使用 <cmath> 中的 std::floor、std::ceil 或 std::round。在進行任何轉換之前,請確保截斷或捨入產生的值在 int 的範圍內;這些強制轉換都不會為你檢查或調整它。