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)即可,有两种方式:
- 将参数强制转换为
double类型 - 使用
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
相关产品推荐
相关产品推荐

