float / int隐式转换

我正在做floatint的乘法和除法,我忘记了隐式转换规则(问题中的单词看起来太模糊了,谷歌比在这里要求更快)。

如果我有两个int ,但我想做浮点除法,我是否只需要转换一个或两个操作数? 乘法怎么样 – 如果我乘以一个float和一个int ,答案是float

您不能通过intfloat分割为int结果,反之亦然。

所以答案是:

如果我有两个int ,但我想做浮点除法……?

一个演员就够了。

如果我乘以floatint ,答案是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之间的操作应该通过将intdouble ,执行操作,然后 - 如果需要 - 将结果转换为float 。 我发现双重渲染的要求令人讨厌,但Java中的类型转换规则要求使用恼人的双重演员或者精度损失。