在int中指定int到byte vs double浮点数

kar*_*g01 4 java

1.当我们为浮点变量编译器赋值时,编译器会给出错误

float f = 2753.2211;
Run Code Online (Sandbox Code Playgroud)

可能丧失精度要求施放.

2.当我们将int分配给字节变量编译器时,不会给我们错误

byte b = 24;
Run Code Online (Sandbox Code Playgroud)



在第二种情况下,数据也可能丢失.那么为什么没有必要明确地进行铸造.

ysh*_*vit 10

JLS明确允许第二种情况作为特例.在处理缩小转换的JLS 5.2中,它说:

此外,如果表达式是byte,short,char或int类型的常量表达式(第15.28节):

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

...

换句话说,对于非long整数样值,你可以暗中缩小他们当且仅当你缩小值是你指定的类型中符合一个常数.

我猜相同的技巧不适用于浮点数,因为浮点值比整数值更棘手.例如,0.1不能在浮点中精确表示,而1.0可以.这意味着实际上double d = 0.1没有将值0.1放入- 只是一个非常接近0.1的值.鉴于此,"它是否恰好适合"规则甚至不适用于浮点文字,并且"当我们缩小时它是否恰好适合"的问题变得更加棘手.您的选择基本上是:d

  • 总是允许它(如果一个值与其文字表示明显不同,这可能会导致一些令人惊讶的行为)
  • 只有在可以准确输入值时才允许它.这看起来非常不一致:
    • float f1 = 1.0double d1 = 1.0两个工作
    • double d2 = 0.1有效,但float f2 = 0.1不 - 令人困惑!
  • 从不允许它(稍微不方便,因为你必须f在文字中键入字符)

鉴于这些选项,似乎JLS的设计者选择了三个不太好的选项中的至少一个.

  • @Kartik_Agarwal因为`b + c`不是_constant表达式_,这部分JLS明确要求. (2认同)

Mak*_*oto 3

在第二种情况下数据不会丢失。

一个字节包含 -128 和 127(含 -128 和 127)的值,因此只要您的 int 符合该范围,就不会发生精度损失。

你的第二个值不是float-literal;默认情况下,Java 中的所有浮点值都是double. float您可以通过f在其末尾添加来显式地将其设为 a 。

float f = 2573.2211f;
Run Code Online (Sandbox Code Playgroud)