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 的范围内;这些强制转换都不会为你检查或调整它。