如何使2整数的除法产生一个浮点数而不是另一个整数?

在另一个 Bruce Eckels 计算速度的练习中,v = s / t中的 s 和 t 是整数。我怎么才能让组织做出花车呢?

class CalcV {
float v;
float calcV(int s, int t) {
v = s / t;
return v;
} //end calcV
}


public class PassObject {


public static void main (String[] args ) {
int distance;
distance = 4;


int t;
t = 3;


float outV;


CalcV v = new CalcV();
outV = v.calcV(distance, t);


System.out.println("velocity : " + outV);
} //end main
}//end class
222294 次浏览

只要先将两个操作数中的一个转换为浮点数即可。

v = (float)s / t;

演员的优先级要高于除法,所以在除法之前就会发生。

另一个操作数将被编译器有效地自动转换为浮点数,因为规则规定,如果任何一个操作数是浮点类型,那么该操作将是一个浮点操作,即使另一个操作数是整数。Java 语言规范,4.2.415.17

你可以选择分子或者分母来浮动。

Int 操作通常返回 int,因此必须更改其中一个操作数。

试试:

v = (float)s / (float)t;

将 int 转换为 float 将允许进行浮点除法。

不过你真的只需要选一个。

将其中一个整数转换为浮点数,以强制使用浮点数运算完成操作。否则,总是首选整数数学。所以:

v = (float)s / t;

您甚至可以对其中一个进行强制转换,但是为了保持一致性,您可能希望显式地对两者进行强制转换,这样类似于 v = (float) s/(float) t 的东西就可以工作了。

为了减少对代码可读性的影响,我建议:

v = 1d* s/t;

将其中一个整数/两个整数都转换为 float,以强制使用浮点数 Math 完成操作。否则,总是首选整数 Math。 所以:

1. v = (float)s / t;
2. v = (float)s / (float)t;

JLS 标准

JLS 715.17.2. 分部接线员/ 说:

整除法四舍五入为0。也就是说,对于二进制数升级(5.6.2)后的整数操作数 n 和 d 所产生的商是一个整数值 q,其大小尽可能大,同时满足 | d · q | ≤ | n | 。此外,当 | n | ≥ | d | 和 n 和 d 具有相同的符号时,q 是正的,而当 | n | ≥ | d | 和 n 和 d 具有相反的符号时,q 是负的。

这就是为什么 1/2不给浮点数。

(float)1/2中,只要将其中一个转换为浮动就足够了,因为 15.17乘法运算符表示:

对操作数执行二进制数值提升

5.6.2. 二进制数字推广表示:

  • 如果其中一个操作数的类型为 double,则另一个操作数将转换为 double。
  • 否则,如果其中一个操作数的类型为 float,则另一个操作数将转换为 float

试试这个:

class CalcV
{
float v;
float calcV(int s, int t)
{
float value1=s;
float value2=t;
v = value1 / value2;
return v;
} //end calcV
}