Java 浮点到整型vs整型到浮点型自动转换
我正在学习Herbert Schildt的《java初学者》一书中的java。据说,作为一个兼容的命运变量,并且足够大以存储一个原始变量,自动转换就完成了 也就是说,Int应该能够存储浮点,反之亦然,因为它们都有4字节大小Java 浮点到整型vs整型到浮点型自动转换,java,Java,我正在学习Herbert Schildt的《java初学者》一书中的java。据说,作为一个兼容的命运变量,并且足够大以存储一个原始变量,自动转换就完成了 也就是说,Int应该能够存储浮点,反之亦然,因为它们都有4字节大小 public class MyClass { public static void main(String args[]) { int i = 10; float f = i; float ff = 10;
public class MyClass {
public static void main(String args[]) {
int i = 10;
float f = i;
float ff = 10;
int ii = ff;
}
}
但是,在编译时,这段代码会产生以下错误:
/MyClass.java:15: error: incompatible types: possible lossy conversion from float to int
int ii = ff;
^
1 error
为什么作为一个兼容的类型,并且足够大,可以相互存储,浮点可以存储int,而int不能存储float
Int应该能够存储浮点,反之亦然,因为它们都有4字节大小
public class MyClass {
public static void main(String args[]) {
int i = 10;
float f = i;
float ff = 10;
int ii = ff;
}
}
数据的大小不是重要的部分。而是关于可以存储在给定字节数中的值
int
只能存储介于-2^31和2^31-1之间的整数值。另一方面,float
可以存储十进制值。因为float也包含小数点后的数字,而int则不包含。如果没有这一点,您就不能通过显式地将浮点转换为int来简单地修剪数字的小数部分。如果整数值在浮点可以存储的最大整数值范围内,则int-to-float决不是有损转换,因为值将始终存储/转换为.0
类似4
将存储为4.0
。但在从float转换为int的情况下,分数值将丢失,所以JVM会给出这样的错误。如果您可以承担这种风险,那么您必须显式地将浮点值转换为int。如您所见,您可以将int
存储到float
中,但不能将float
放在int
中
之所以会出现这种情况,是因为float的内部结构是一个十进制数,而int,顾名思义,是整数
有关更多信息,您可以查看有关的讨论。由于主代码中未显示
ii
和ff
,因此此问题可能会被否决。1234.5678如何存储为“int”?您可以建议我而不是insta downvoting。我用正确的代码编辑了主题。我在这里的目的是学习Java处理转换的方式,而不是简单地发布一个问题。如果你希望得到一个令你满意的答案,你必须问自己真正想知道的是什么(我没有否决你,因为你是新来的,这是惯例)。看起来,即使使用正确的代码,也没有人试图回答这个问题。当然,你不能读心术,但当你花时间经常去学习(而不是心灵感应)论坛,而且编辑是免费的,而且编辑速度很快,当你只能建议代码缺失时,没有理由释放下推。更确切地说,从浮点
转换为整数
会导致精度损失,这是信息的丢失。因此,您必须使用显式强制转换:inti=(int)floatVariable但是当你把int i=3/4设为0时,编译器不是这样做的吗?不完全是这样。“int除以int”定义为导致int的运算;结果的截断是计算的一部分。计算机通常有一条指令可以精确地实现这一点(尽管Java在虚拟机中执行)。因此,除法的结果是一个int,将其存储在int变量中很简单。从int
->float
和从float
->int
进行的两种转换都可能会丢失信息int
->float
这是一种潜在的精度损失,因为并非每个int
都可以表示为float
,例如值2147483641
(float仅为24个有效位)float
->int
,除了分数微调导致的精度明显降低外,int
不能表示float
可以表示的值的范围/大小。语言设计者认为范围的丢失比精度的丢失更严重,因此float
->int
不是隐式的,而int
->float
是隐式的。int-to-float从来都不是有损转换
实际上,这不是真的,因为IEEE 754 32位浮点值只有24个有效值(尾数)位。因此必然会丢失信息(更精确地说,丢失精度),因为浮点不能以相同的精度表示所有的int值。可表示的数字中会有间隙,间隙会随着值的大小而增大。例如,int2147483641
不能表示为浮点而不损失精度。2147483641
周围的下两个可表示的int是>2147483520
和2147483647
。