char c =某些整数文字可能会编译但浮动f =某些浮点文字永远不会编译.为什么?

Piy*_*agi 5 java floating-point character type-conversion literals

char c1 = 123; //Compiles fine
char c2 = 123456; //Error: cannot convert from int to char
Run Code Online (Sandbox Code Playgroud)

Java足够聪明,可以确定整数是否足够小以转换为字符.为什么它无法将非常小的浮点文字转换为浮点数?例如:

float f1 = 0.3; //Error: cannot convert from double to float
float f2 = 0.3f; //Compiles fine
Run Code Online (Sandbox Code Playgroud)

char c =某些整数文字可能会编译但浮动f =某些浮点文字永远不会编译.为什么?

PS:我知道默认情况下浮点文字被视为double

Era*_*ran 7

0.3 被视为double,因此它的二进制表示形式需要64位,并且它不能适应浮点而不会丢失精度,因此如果没有显式强制转换,则无法将其赋值给float变量.

另一方面,如果为char变量分配char类型范围内的int文字(例如123),则不会丢失数据.

两个赋值(int到char变量和double到float变量)都需要缩小基元转换.

JLS 5.2

如果变量的类型是byte,short或char,则可以使用缩小的基元转换,并且常量表达式的值可以在变量的类型中表示.

  • 我想补充一点,`0.3`不能用***精度级别的二进制浮点精确表示. (3认同)
  • @RedRoboHood这可能是真的(我没有检查),但即使它不是它也不会有所作为.`float d = 0.5;`也无法编译,即使0.5可以精确表示float和double精度. (2认同)