如何在 C++ 中把浮點數轉換為整數

Jinku Hu 2023年1月30日 2020年11月24日
  1. 使用直接賦值將浮點數轉換為整數
  2. 使用 C-style Cast 將浮點數轉換為整數
  3. 使用 static_cast 將浮點數轉換為整數
如何在 C++ 中把浮點數轉換為整數

本文將演示如何在 C++ 中把浮點型轉換為整型的多種方法。

使用直接賦值將浮點數轉換為整數

浮點數和整數值之間的轉換可以使用賦值運算子來完成。在這種情況下,浮點型變數將被隱式轉換為整型型別,值將被縮小到第二種型別,失去小數點後的所有數字。注意,我們使用 int 的向量來儲存 float,然後將每個整數輸出到控制檯,以便更好的演示。

#include <iostream>
#include <string>
#include <vector>

using std::cout;
using std::endl;
using std::vector;

int main(){
    vector<float> f_vec { 12.123, 32.23, 534.333333339 };
    vector<int> i_vec;

    i_vec.reserve(f_vec.size());
    for (const auto &f : f_vec) {
        i_vec.push_back(f);
    }

    for (const auto &i : i_vec) {
        cout << i << "; ";
    }
    cout << endl;

    return EXIT_SUCCESS;
}

輸出:

12; 32; 534;

使用 C-style Cast 將浮點數轉換為整數

另一種解決方案是用 (typename) 符號進行 C 風格的轉碼。這種方法在現代 C++ 中通常被認為是不安全的,但如果程式設計師正確使用它,程式碼就會按預期執行。注意千萬不要將指標投向不完整的類,因為它可能導致未定義的行為。

#include <iostream>
#include <string>
#include <vector>

using std::cout;
using std::endl;
using std::vector;

int main(){
    vector<float> f_vec { 12.123, 32.23, 534.333333339 };
    vector<int> i_vec;

    i_vec.reserve(f_vec.size());
    for (const auto &f : f_vec) {
        i_vec.push_back(int(f));
    }

    for (const auto &i : i_vec) {
        cout << i << "; ";
    }
    cout << endl;

    return EXIT_SUCCESS;
}

輸出:

12; 32; 534;

使用 static_cast 將浮點數轉換為整數

根據現代 C++ 的建議,應該利用命名轉換法將浮點數值轉換為整數。static_cast 轉換型別而不檢查值;因此程式設計師有責任確保正確性。需要注意的是,命名轉換和它們的行為相當複雜,需要通過一個概述來掌握,所以這裡是 static_cast完整手冊,列出了所有的邊緣情況和特性。

#include <iostream>
#include <string>
#include <vector>

using std::cout;
using std::endl;
using std::vector;

int main(){
    vector<float> f_vec { 12.123, 32.23, 534.333333339 };
    vector<int> i_vec;

    i_vec.reserve(f_vec.size());
    for (const auto &f : f_vec) {
        i_vec.push_back(static_cast<int>(f));
    }

    for (const auto &i : i_vec) {
        cout << i << "; ";
    }
    cout << endl;

    return EXIT_SUCCESS;
}

輸出:

12; 32; 534;
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn

相關文章 - C++ Float