4

我的代码是这样的——

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
}

你能解释为什么会这样吗?

4

6 回答 6

8

原因在JLS 5.1.2中指定:它说 : long to float 或 double是扩大转换。
float 到 byte、short、char、int 或 long正在缩小转换范围。
这就是为什么
float b=a;在您的程序中运行良好的原因,因为它正在扩大转换范围。
并且 long c=b;显示编译错误,因为它是一个缩小转换。

于 2013-06-30T10:57:57.137 回答
7

当您从整数类型转换为浮点类型时,您想要做什么总是很清楚:您更改数字的表示,但您保持相同的数字。

另一方面,从浮点类型转换为整数类型有一些歧义:不清楚你想对小数部分做什么。你可能想要

  • 截断小数部分,
  • 执行数学舍入,或
  • 将数字向上取整。

这就是为什么该语言要求您在将浮点数转换为整数类型时具体说明您想要做什么。

于 2013-06-30T10:58:57.790 回答
2

因为 along可以表示为 a float,但 anyfloat不能表示为 a long。那是数学而不是Java。

在这里,您可以添加强制转换来强制编译。当然,由于您将 a 转换float为 a ,因此您可能会失去精度long

long c = (long) b;
于 2013-06-30T10:53:09.253 回答
0

转换规则基于数据类型可以表示的数字范围。允许的范围long包含在 允许的范围内float,因此尽管明显损失了精度,但仍允许进行隐式转换:long 存储 64 位,而 float 仅为 32 位,因此转换会丢弃一半的数据。

于 2013-06-30T10:58:44.707 回答
0

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 中查看更多信息。扩大基元转换

于 2013-06-30T11:01:32.237 回答
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).

现在您可以意识到我们是否要在其他人中表示一些浮点值和双精度值。原始数字(浮点数或双精度数)的一部分将丢失。所以在这种情况下无法进行铸造

于 2013-06-30T11:01:59.357 回答