我的代码是这样的 -
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
}
你能解释一下为什么会这样吗?
答案 0 :(得分:8)
原因在JLS 5.1.2中指定:
它表示:长期浮动或双重是一种扩大的转换
然而,浮动到byte,short,char,int或long 正在缩小转换。
这就是为什么
float b=a;
在您的计划中运作正常,因为它正在扩大转化率
和
long c=b;
显示编译错误,因为它是一个缩小的转换。
答案 1 :(得分:7)
当您从整数类型转换为浮点类型时,始终清楚您要执行的操作:您更改数字的表示形式,但保持相同的数字。
另一方面,从浮点转换为整数类型有一些模糊性:不清楚你想对小数部分做什么。你可能想要
这就是为什么语言要求您具体说明在将浮点数转换为整数类型时要执行的操作。
答案 2 :(得分:2)
因为long
可以表示为float
,但任何float
都不能表示为long
。这是数学而不是Java。
在这里你可以添加一个强制转换来强制编译。当然,由于您要将float
转换为long
,否则可能会失去精确度。
long c = (long) b;
答案 3 :(得分:0)
转换规则基于数据类型可以表示的数字范围。 long
允许的范围包含在float
允许的范围内,因此尽管存在明显的精度损失,仍允许隐式转换:长存储64位而浮点数仅为32,因此转换丢失了一半数据。
答案 4 :(得分:0)
我允许使用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);
了解详情
答案 5 :(得分:0)
看看这个
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).
现在你可以意识到我们是否要在其他人中表示一些浮点值和双值。原始数字(浮点数或双数)的一部分将丢失。所以在这种情况下不可能进行铸造