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

时间:2014-12-10 15:21:34

标签: java

1.当我们将 double赋给float变量时,编译器会给出错误

float f = 2753.2211;

可能会失去精确度需要投射。

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

byte b = 24;

确定

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

3 个答案:

答案 0 :(得分:10)

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

  

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

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

...

换句话说,对于非long整数类值,您可以隐式缩小它们 iff 您缩小的值是一个适合您的类型的常量重新指定。

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

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

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

答案 1 :(得分:3)

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

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

您的第二个值不是float-literal;默认情况下,Java中的所有浮点值都是double。您可以通过在其末尾添加float来明确指定f

float f = 2573.2211f;

答案 2 :(得分:0)

int是一个32位有符号整数,byte是一个8位有符号整数。 byte从-128到127运行,而int从-2147483648运行到2147483647

精确度不会丢失,但不要将较大的int投放到较小的byte中,否则您将丢失数据。