float / int隐式转换
我正在做float
和int
的乘法和除法,我忘记了隐式转换规则(问题中的单词看起来太模糊了,谷歌比在这里要求更快)。
如果我有两个int
,但我想做浮点除法,我是否只需要转换一个或两个操作数? 乘法怎么样 – 如果我乘以一个float
和一个int
,答案是float
?
您不能通过int
将float
分割为int
结果,反之亦然。
所以答案是:
如果我有两个
int
,但我想做浮点除法……?
一个演员就够了。
如果我乘以
float
和int
,答案是float
吗?
是的。
float f = 1000f; int i = 3; f = i; // Ok i = f; // Error f = i/f; //Ok 0.003 f = f/i; //Ok 333.3333(3) i = i/f; //Error i = f/i; //Error
展示:
int i1 = 5; float f = 0.5f; int i2 = 2; System.out.println(i1 * f); System.out.println(i1 / i2); System.out.println(((float) i1) / i2);
结果:
2.5 2 2.5
为了使用整数执行任何类型的浮点运算,您需要将至少一个操作数转换(读取:强制转换)为float
类型。
如果二元运算符的至少一个操作数是浮点类型,则操作是浮点运算,即使另一个是整数。
(来源: Java语言规范 – 4.2.4 )
如果我乘以一个浮点数和一个int,答案是浮点数吗?
System.out.println(((Object)(1f*1)).getClass());//class java.lang.Float
(如果你使用DrJava,你只需在交互面板中输入((Object)(1f * 1))。getClass()。还有一个DrJava for Eclipse的插件。)
简单的答案是Java会自动执行扩展转换,但不会缩小转换范围。 因此,例如int-> float是自动的,但float-> int需要强制转换。
Java按照int < long < float < double
的顺序对基本类型进行排序。 如果运算符与不同的基本类型一起使用,则在上面列表中出现在另一个之前的类型将隐式转换为另一个,而不进行任何编译器诊断,即使在这会导致精度损失的情况下也是如此。 例如, 16777217-1.0f
将产生16777215.0f(比正确值小1)。 在许多情况下, float
和+/- 16777216范围之外的int
之间的操作应该通过将int
为double
,执行操作,然后 - 如果需要 - 将结果转换为float
。 我发现双重渲染的要求令人讨厌,但Java中的类型转换规则要求使用恼人的双重演员或者精度损失。