为什么Java的Math.round()无法处理这个数字?

swd*_*dev 5 java rounding

我有这样的代码:

System.out.println("Math.round(1423562400L) => " + Math.round(1423562400L));
Run Code Online (Sandbox Code Playgroud)

结果如下:

Math.round(1423562400L) => 1423562368
Run Code Online (Sandbox Code Playgroud)

此值是64位整数,但它很容易适合32位整数,该整数应该适合双精度.到底是怎么回事?

shm*_*sel 7

根据JLS,

15.12.2.5.选择最具体的方法

如果多个成员方法都可访问并适用于方法调用,则必须选择一个为运行时方法调度提供描述符.Java编程语言使用选择最具体方法的规则.

非正式的直觉是,如果第一个方法处理的任何调用都可以传递给另一个没有编译时类型错误的调用,那么一个方法比另一个方法更具体.

接下来Math.round(float)是更具体的Math.round(double),因为它们都是有效的重载,编译器选择前者,导致数据丢失.

要更正输出,只需更改1423562400L1423562400d.