浮点数转整数是向零截断:3.7→3、-3.7→-3,非四舍五入或向下取整;各语言默认如此,但负数易误用,且超范围时结果未定义。

浮点数向整数强制转换时“直接舍弃小数部分”,本质是向零截断(truncation toward zero),不是四舍五入,也不是向下或向上取整。它只保留原数的整数部分,把小数点后所有内容无条件丢掉,符号保持不变。
截断 ≠ 四舍五入
四舍五入会看小数第一位决定进位,比如 3.7 → 4、-3.7 → -4;而截断永远只取整数段:3.7 → 3、-3.7 → -3。两者逻辑完全不同,不能混用。需要四舍五入时,必须调用 round()、lroundf() 或手动加偏移(如 int(x + 0.5)),不能依赖强转。
各语言中截断的具体表现
多数主流语言默认强转即截断:
- C/C++/Java:
(int)3.9得 3,(int)-3.9得 -3 - Python:
int(3.9)或math.trunc(3.9)都得 3;int(-3.9)得 -3 - JavaScript:
3.9 | 0或Math.trunc(3.9)得 3;负数同理 - STEP7:
TRUNC指令专为此设计,输入 12.99 输出 12,输入 -12.99 输出 -12
为什么负数截断容易出错?
因为“舍弃小数”在负数上不等于“向下取整”。例如分页计算偏移量:offset = (int)(-3.9 * 10) 得 -30,但若业务本意是“取第4页起始位置”,就该用 floor() 得 -40。PHP 文档特别提醒:金融或索引类场景慎用 (int),应按语义选 floor()、ceil() 或 round()。
溢出风险不可忽视
截断本身不解决范围问题。若浮点数超出目标整型可表示范围(如 float 值为 1e10 转 int16),结果未定义——可能为随机值、0 或引发异常。Microsoft Learn 明确指出:“无法表示时,结果值是未定义的”。实际编码中,应先判断范围再转换。

















