我的代码是这样的——
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
}
你能解释为什么会这样吗?
原因在JLS 5.1.2中指定:它说 : long to float 或 double是扩大转换。
而float 到 byte、short、char、int 或 long正在缩小转换范围。
这就是为什么
float b=a;
在您的程序中运行良好的原因,因为它正在扩大转换范围。
并且
long c=b;
显示编译错误,因为它是一个缩小转换。
当您从整数类型转换为浮点类型时,您想要做什么总是很清楚:您更改数字的表示,但您保持相同的数字。
另一方面,从浮点类型转换为整数类型有一些歧义:不清楚你想对小数部分做什么。你可能想要
这就是为什么该语言要求您在将浮点数转换为整数类型时具体说明您想要做什么。
因为 along
可以表示为 a float
,但 anyfloat
不能表示为 a long
。那是数学而不是Java。
在这里,您可以添加强制转换来强制编译。当然,由于您将 a 转换float
为 a ,因此您可能会失去精度long
。
long c = (long) b;
转换规则基于数据类型可以表示的数字范围。允许的范围long
包含在 允许的范围内float
,因此尽管明显损失了精度,但仍允许进行隐式转换:long 存储 64 位,而 float 仅为 32 位,因此转换会丢弃一半的数据。
I Java 隐式扩大转换是允许的,但不允许缩小。这基本上意味着可以转换为任何可以保存与原始数据类型一样大或更大的值的数据类型,而无需显式转换数据。但是,这确实意味着您可能会失去精度。
前任。
long original = Long.MAX_VALUE-1;
float f = original;
long result = (long) f;
System.err.println(original);
System.err.println(f);
System.err.println(result);
在JLS 5.1.2 中查看更多信息。扩大基元转换
看看这个
byte
1 signed byte (two's complement). Covers values from -128 to 127.
short
2 bytes, signed (two's complement), -32,768 to 32,767
int
4 bytes, signed (two's complement). -2,147,483,648 to 2,147,483,647.
Like all numeric types ints may be cast into other numeric types
(byte, short, long, float, double). When lossy casts are done (e.g.
int to byte) the conversion is done modulo the length of the smaller
type.
long
8 bytes signed (two's complement). Ranges from
-9,223,372,036,854,775,808 to +9,223,372,036,854,775,807.
float
4 bytes, IEEE 754. Covers a range from 1.40129846432481707e-45
to 3.40282346638528860e+38 (positive or negative).
Like all numeric types floats may be cast into other numeric types
(byte, short, long, int, double). When lossy casts to integer types
are done (e.g. float to short) the fractional part is truncated and
the conversion is done modulo the length of the smaller type.
double
8 bytes IEEE 754. Covers a range from 4.94065645841246544e-324d
to 1.79769313486231570e+308d (positive or negative).
现在您可以意识到我们是否要在其他人中表示一些浮点值和双精度值。原始数字(浮点数或双精度数)的一部分将丢失。所以在这种情况下无法进行铸造