double转int向零截断(如-3.9→-3),应使用static_cast而非c风格转换;需四舍五入时须先调用std::round;超出int范围将导致未定义行为。

double 强制转 int 会丢弃小数部分,只保留整数部分,且向零取整(不是四舍五入)。这是 C++ 中最基础、也最容易被误解的类型转换行为。
截断取整:向零而非四舍五入
直接赋值或用 static_cast
- 正数:3.9 → 3,2.1 → 2
- 负数:-3.9 → -3,-2.1 → -2
注意:-3.9 变成 -3,不是 -4 —— 这是向零取整(truncation),不是数学上的向下取整(floor)或四舍五入(round)。
推荐写法:用 static_cast 而非 C 风格括号
显式转换应优先使用 static_cast
- ✅ 推荐:
int i = static_cast<int>(3.7);</int> - ⚠️ 不推荐:
int i = (int)3.7;(C 风格,易混淆,不适用于模板等复杂场景)
static_cast 适用于所有良性的浮点→整数转换,不改变原始值含义,仅执行标准截断规则。
需要四舍五入?必须调用 round()
如果目标是数学意义上的四舍五入(如 3.5 → 4,-3.5 → -4),不能依赖强制转换,而要借助
- 先调用
round(d),返回仍是 double - 再用
static_cast<int></int>转为 int:int i = static_cast<int>(round(3.7)); // 得 4</int> - 对负数同样有效:
round(-3.7)返回 -4.0,转 int 后为 -4
手动加 0.5(如 static_cast<int>(d + 0.5)</int>)只对正数成立,负数会出错,不建议在生产代码中使用。
边界与溢出风险不可忽视
double 可表示的范围远大于 int(例如 double 可达 ±1e308,而 int 通常仅 ±2e9)。若待转数值超出 int 表示范围,结果是未定义行为(undefined behavior):
- 例如:
double d = 1e10; int i = static_cast<int>(d);</int>—— i 的值无法预测 - C++ 标准不保证溢出时的截断方式,不同平台可能返回不同结果
- 安全做法:转换前用
if (d >= INT_MIN && d 检查范围











