好,所以我知道float是32位十进制。 Double是64位十进制。长为64位整数。那么为什么要使用该值:Float(32位)<-Long(64位)。显然不是Java代码,但是我在Java中引用它。即使将其压缩为32位并失去精度,它也会自动进行转换。因此,这意味着精度无关紧要。但是,除非将double显式转换为int,否则int <-double无效。它的大小较小,它们既是数字又是基元。只是一般规则:十进制数<-整数,与位大小无关。它将循环返回。只是这个规则,一切都可以在Java中的Numbers中工作?显示实际代码:
long L = 10_000L;
float f = L;
请注意,问题具体是关于long
到float
而没有显式强制转换,而不是float
到long
,而不是显式强制转换。
答案 0 :(得分:6)
将long
转换为float
是widening primitive conversion。 Java允许它没有错误,因为...是以这种方式定义的。从链接:
原始类型上的19种特定转换称为扩展原始类型转换:
byte
至short
,int
,long
,float
或double
short
至int
,long
,float
或double
char
至int
,long
,float
或double
int
至long
,float
或double
long
至float
或double
...
从
int
到float
或从long
到float
或从长时间加倍,可能会导致精度降低-也就是说,结果可能会丢失该值的某些最低有效位。在这种情况下,使用IEEE 754舍入到最近模式(第4.2.4节),结果浮点值将是整数值的正确舍入版本。
(我的重点。)
为什么允许它而不需要显式强制转换?通常,只有詹姆斯·高斯林和当时的其他人可以回答这种问题。对于我们其他人,答案是:因为这就是规范所说的。
但是,我要指出的是,即使精度损失了,总的幅度也没有,我敢打赌这是允许的原因。 float
可以精确地保存非常个大值。例如:
class Demo {
public static void main(String[] args) {
long l = Long.MAX_VALUE;
float f = l;
System.out.println(l);
System.out.println(f);
}
}
运行它,您会得到:
9223372036854775807 9.223372E18
9.223372e18是9223372000000000000。比较:
9223372036854775807 - the long value 9223372000000000000 - the float value
这是因为float
可以牺牲值范围的精度,因为float
存储它会提高到指数的基值。来自Wikipedia's article on the IEEE-754 binary32 format(这是Java的class Demo {
public static void main(String[] args) {
float f = 16_777_216f;
System.out.println(String.format("%8.0f", f)); // 16777216
System.out.println(String.format("%8.0f", f + 1)); // 16777216 (still)
}
}
的意思):
... IEEE 754 32位base-2浮点变量的最大值为(2 − 2 −23 )×2 127 ≈3.402823 ×10 38 ...
3.402823×10 38 是:
340,282,300,000,000,000,000,000,000,000,000,000,000
... 但是它可以存储的最高整数,以便您可以加1而不会损失精度,仅为2 24 -1(16,777,215)。它可以存储16,777,216,但不能存储16,777,217。所以16,777,216 + 1仍然是16,777,216:
long
那是因为它现在存储的是将基值除以2,指数为2,因此它不再存储奇数。您获得的越高,就越糟,只能存储4、8、16的倍数。
与float
的最大值(即2 63 -1)(仅为“ only”)进行对比:
9,223,372,036,854,775,807
但是与number
不同,它可以精确地表示每个整数。
答案 1 :(得分:-3)
有些类似隐式类型转换。如果您不会丢失信息,Javajava会自动强制转换。从浮点到多点,您可能会丢失所有浮点后的内容,因此不会进行隐式强制转换,因为通常您不想丢失此信息。