Java浮点数转整数关键在于舍入规则:向零截断((int)x)丢小数、符号不变;向下取整用Math.floor();四舍五入推荐(long)(x+0.5)而非Math.round()的银行家舍入。

Java中浮点数转整数,关键不是“怎么转”,而是“按什么规则转”。截断是向零舍弃小数部分,不是四舍五入,也不是向下取整——这点在负数和业务逻辑中极易出错。
向零截断:用 (int) 或 (long) 最直接
强制类型转换是纯粹的向零截断:丢掉小数,符号不变。
- (int)3.9 → 3,(int)-3.9 → -3(不是 -4)
- 适用于明确要“只取整数位”的场景,比如解析坐标、索引偏移、ID提取
- 注意溢出:若 double 值超出 int 范围(如
Double.MAX_VALUE),结果未定义,可能为任意值
向下取整:用 Math.floor() 处理负数边界
当需要“≤x 的最大整数”时(例如分页起始位置、内存对齐、区间左边界),必须用 Math.floor()。
- Math.floor(3.9) → 3.0,Math.floor(-3.9) → -4.0
- 返回 double 类型,需显式转成 int/long:
(int)Math.floor(x) - 对 float 推荐用
Math.floorf(x),避免 double 中间提升带来的精度扰动
四舍五入要小心:Math.round() 是银行家舍入
Math.round() 不等于数学四舍五入。它采用银行家舍入法:遇到 .5 时向偶数靠拢。
立即学习“Java免费学习笔记(深入)”;
- Math.round(2.5) → 2,Math.round(3.5) → 4
- Math.round(-2.5) → -2(-2 是偶数,且比 -3 更接近)
- 报表、UI展示等需严格四舍五入的场合,建议用
(long)(x + 0.5)(正数)或封装带符号逻辑
别踩这些坑
常见误用会埋下隐蔽 bug:
- 把
Double.valueOf("3.7").intValue()当作数值转换——本质是字符串解析+截断,绕路且易抛异常 - 用
new Integer(doubleValue)——JDK 9+ 已废弃,且自动装箱掩盖语义 - 依赖
DecimalFormat或String.split()做数值截断——它们处理的是字符串表现,非真实数值,无法用于计算 - 在高频循环中无必要封装
Math.round()——它比(long)(x + 0.5)慢 15%~20%,因含 NaN/Infinity 检查


















