为什么int/byte/short/long可以在没有类型转换的情况下转换为float/double,反之亦然

Shr*_*wat 4 java variables

我的代码是这样的 -

public void abc{     
 long a=1111;
 float b=a; // this works fine even though this is narrowing conversion
 long c=b;// this gives compilation error
}
Run Code Online (Sandbox Code Playgroud)

你能解释一下为什么会这样吗?

Mac*_*Mac 8

原因在JLS 5.1.2中指定:它表示:long to float或double是一个扩展转换.
float,byte,short,char,int或long缩小了转换.
这就是为什么
float b=a;你的程序运行正常,因为它正在扩大转换.
并且 long c=b;显示编译错误,因为它是一个缩小的转换.


das*_*ght 7

当您从整数类型转换为浮点类型时,始终清楚您要执行的操作:更改数字的表示形式,但保留相同的数字.

另一方面,从浮点转换为整数类型有一些模糊性:不清楚你想对小数部分做什么.你可能想要

  • 截断小数部分,
  • 执行数学舍入,或
  • 将数字向上舍入.

这就是为什么语言要求您具体说明在将浮点数转换为整数类型时要执行的操作.