math.round(double)直接返回long类型,实现四舍五入转长整型;对float需先转double再调用,避免int溢出;推荐封装roundtolong方法统一处理,勿手动用floor+0.5模拟。

Math.round() 本身不直接返回 long 类型,但可以结合类型转换实现“四舍五入后转为长整型”的效果。关键在于理解它的行为:对 float 参数调用时返回 int,对 double 参数调用时返回 long。
使用 Math.round(double) 直接获得 long 结果
这是最直接的方式。只要传入 double 类型的浮点数,Math.round(double) 就会按四舍五入规则(.5 向正无穷方向舍入)返回 long:
- 注意:Math.round(2.5) 返回 3L,Math.round(-2.5) 返回 -2L(因为 -2.5 舍入到离零更远的 -2,即向正无穷方向)
- 示例:
long result = Math.round(3.7); // 得到 4L - 若原始数据是 float,先强制转为 double 再调用:
Math.round((double)myFloat)
避免 int 截断陷阱(尤其处理大数值时)
如果误用 Math.round(float),返回的是 int,可能溢出或丢失精度:
- 例如:
Math.round(1000000000.7f)返回 int,最大值仅约 21 亿,而 10^9 已接近上限 - 正确做法:统一用 double 版本,即使输入是 float,也先提升为 double:
Math.round(1000000000.7f)❌ →Math.round((double)1000000000.7f)✅
封装成可复用的方法(推荐)
为清晰和安全,建议封装一个明确语义的方法:
public static long roundToLong(double value) { return Math.round(value); }public static long roundToLong(float value) { return Math.round((double)value); }- 这样调用时语义明确:
long n = roundToLong(123.456f);
与 (long)Math.floor(x + 0.5) 的区别
不要手动用 floor + 0.5 模拟四舍五入,尤其对负数会出错:
-
(long)Math.floor(-2.5 + 0.5)得到 -2L,看似对;但(long)Math.floor(-2.6 + 0.5)得到 -3L,而 Math.round(-2.6) 是 -3L —— 表面一致,但边界行为不等价 - Math.round 严格按 IEEE 754 规则定义,-0.5 → 0,-1.5 → -1,逻辑统一;手动加 0.5 在浮点误差下还可能引发意外
- 结论:信任 Math.round(double),不自行重写舍入逻辑










