You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中Math.round传入整数返回异常结果,是否为Bug?

Math.round传入整数返回重复结果的原因及解决办法

这不是Java的Bug,是你忽略了方法重载匹配规则和float类型的精度限制。

问题根源

Math.round有两个重载:

  • Math.round(double a):处理双精度浮点数,精度足够表示你传入的所有整数
  • Math.round(float a):处理单精度浮点数,精度有限

你传入的是int类型参数,Java会自动将其转换为float(而非double)来匹配重载方法。但float只有24位有效二进制位,对应十进制约7-8位有效数字,而你传入的数值都是10位整数,超出了float的精确表示范围——这些不同的int值转成float后,都被近似成了同一个值1669053312.0f,所以round后的结果完全一致。

验证与修正

要解决这个问题,只需要让调用匹配Math.round(double)即可,有两种方式:

  1. 将参数强制转换为double类型
  2. 使用long类型传入(会自动转double)

修正后的测试代码:

public static void main(String[] args) {
    // 强制转double调用对应重载
    System.out.println("roundOff1: " + Math.round((double)1669053278));
    System.out.println("roundOff2: " + Math.round((double)1669053304));
    System.out.println("roundOff3: " + Math.round((double)1669053314));
    System.out.println("roundOff4: " + Math.round((double)1669053339));

    // 针对你的需求:System.currentTimeMillis()返回long,除以1000后本身就是整数
    long timestampSec = System.currentTimeMillis() / 1000;
    // 这里完全不需要round,因为整数除法已经自动截断小数
    System.out.println("Timestamp in seconds: " + timestampSec);
}

运行后会输出每个参数的正确原值,而System.currentTimeMillis()/1000的结果本身就是整数,根本不需要调用Math.round——Java中整数除以整数会执行截断式整数除法,直接得到取整后的结果。

内容的提问来源于stack exchange,提问作者Aayush Jain

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 07:45:31