1.当我们将 double赋给float变量时,编译器会给出错误
float f = 2753.2211;
可能会失去精确度需要投射。
2.当我们将 int分配给字节变量编译器时,不要给我们错误
byte b = 24;
确定
在第二种情况下,数据也可能丢失。那么为什么没有必要明确地进行转换。
答案 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.0
和double 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
中,否则您将丢失数据。