为什么在Java中将长整型转换为双精度浮点型?

3

SSCCE:

public class Test {

    public static void main(String[] args) {
        Long a = new Long(1L);
        new A(a);
    }

    static class A {
        A(int i) {
            System.out.println("int");
        }

        A(double d) {
            System.out.println("double");
        }
    }
}

输出:

double

不会输出编译错误,程序可以正常运行,并调用 double 参数的构造函数。但是为什么呢?

4个回答

9
这是由于类型提升规则:将long转换为double优先于转换为intlong始终可以适应double,尽管如果long大于2的53次方,则可能会失去精度。因此,编译器选择double构造函数作为更好的匹配项,而不是int构造函数。
(编译器没有进行动态检查,即1L确实适合转换为int)。

我理解 "fit" 这个东西,但为什么没有编译错误我就不明白了? - SeniorJD
你不会收到错误提示,因为这并不是一个错误。但编译器可能会警告你存在潜在的精度损失转换。 - Bathsheba
例如,在C++中,如果您尝试将long long值放入intdouble构造函数中,将会出现编译错误。 - SeniorJD

2

int 占用 4 字节,而 longdouble 占用 8 字节。

因此,如果将其转换为 int,则很明显有可能丢失 4 个字节的数据。数据类型总是向上转换的。正如 @Bathsheba 的评论所提到的,即使使用 double,也有可能存在数据损失,但与 int 相比,损失要小得多。

Double bits

如您所见,double 使用 52 位来存储有效数字。如果选择 int,则该变量将有 32 位可用。因此,JVM 选择 double 而不是 int。

来源:维基百科


2
long转换为int是一种缩小原始类型转换,因为它可能会丢失值的整体大小。将long转换为double是一种扩大原始类型转换
编译器将自动生成赋值上下文转换参数。这包括扩大原始类型转换,但不包括缩小原始类型转换。因为带有int参数的方法需要进行缩小转换,所以对该调用不适用。

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接