C++中如何将float类型转换为去掉小数点的int类型?
C++ 将float去掉小数点转换为int的最快实现方案
前置提醒:float是二进制浮点存储类型,无法100%精确表示所有十进制小数,例如字面量
2.521f实际存储的值可能是2.5209999084472656这类接近值,直接运算时需要做误差修正。
固定小数位数场景(性能最优)
如果你的业务场景中float的小数位数是固定的(比如示例中的3位小数),直接用算术运算转换是最快的,仅需要单CPU周期即可完成,无任何额外开销:
- 核心逻辑:将float乘以对应10的n次方(n为小数位数),加上极小的epsilon值修正浮点误差后强转int即可
- 代码示例:
// 示例为固定3位小数的场景 float F = 2.521f; // 1e-6为误差修正值,避免浮点存储精度问题导致的截断错误 int result = static_cast<int>(F * 1000 + 1e-6); // 此时result值为2521
动态小数位数场景
如果float的小数位数不固定,需要自动识别所有小数位,这种场景最快的实现方式是字符串转换,不过性能比算术运算低2个数量级以上,仅建议必要时使用:
- 核心逻辑:将float转为十进制字符串,删除小数点后再转回int
- 代码示例:
#include <string> #include <stdexcept> #include <climits> int dynamicFloatToInt(float num) { // 处理负数边界 bool is_negative = num < 0; if (is_negative) num = -num; std::string num_str = std::to_string(num); // 去除末尾多余的后缀0 num_str.erase(num_str.find_last_not_of('0') + 1, std::string::npos); // 去除末尾残留的小数点 if (num_str.back() == '.') num_str.pop_back(); // 删除中间的小数点 size_t dot_pos = num_str.find('.'); if (dot_pos != std::string::npos) { num_str.erase(dot_pos, 1); } long long temp = std::stoll(num_str); // 处理int溢出边界 if (temp > INT_MAX || temp < INT_MIN) { throw std::overflow_error("转换结果超出int取值范围"); } return is_negative ? -static_cast<int>(temp) : static_cast<int>(temp); }
注意事项
- 算术转换方案仅适用于小数位数固定的场景,精度和性能都是最优
- 两种方案都需要注意转换结果不能超出int的取值范围,否则会出现溢出错误
- 如果对精度要求极高,建议先将float替换为十进制浮点类型或者
std::string存储原始值,再做转换
内容的提问来源于stack exchange,提问作者G.Azma
相关产品推荐
相关产品推荐

