在另一个布鲁斯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
9条答案
按热度按时间qlvxas9a1#
只需要先将两个操作数中的一个转换为浮点数。
强制转换的precedence比除法高,所以在除法之前发生。
另一个操作数将被编译器有效地自动转换为浮点数,因为规则表明,如果其中一个操作数是浮点类型,则该操作将是浮点操作,即使另一个操作数是整数。Java语言规范,§4.2.4和§15.17
mbjcgjjk2#
试试看:
将整型转换为浮点数将允许浮点除法发生。
但你真的只需要投一个。
bvhaajcl3#
将其中一个整数强制转换为浮点数,以强制使用浮点数学完成操作。否则,始终首选整数数学。因此:
xqkwcwgp4#
为了减少对代码可读性的影响,我建议:
ve7v8dk25#
你可以将分子或分母转换为浮点数…
int运算通常返回int,因此必须更改其中一个操作数。
1qczuiv06#
你甚至可以只强制转换其中一个,但是为了一致性,你可能想显式地强制转换两者,所以像v =(float)s /(float)t这样的东西应该可以工作。
mspsb9vt7#
将其中一个整数/两个整数强制转换为float,以强制使用浮点数学完成操作。否则,始终首选整数数学。因此:
olhwl3o28#
JLS标准
JLS 7 15.17.2.部门运营商/说:
整数除法向0舍入。也就是说,对于二进制数字提升(§5.6.2)后为整数的操作数n和d产生的商是一个整数值q,其大小尽可能大,同时满足|d · q|不超过|n|此外,q为正,当|n|≥|d|并且n和d具有相同的符号,但是q是负的,当|n|≥|d|并且n和d具有相反的符号。
这就是为什么
1/2
不给予浮点数。只将其中一个转换为浮点数就足够了,如
(float)1/2
,因为15.17.乘法运算符说:对操作数执行二进制数字提升
and 5.6.2. Binary Numeric Promotion说道:
z4bn682m9#
试试这个: