在计算速度的另一个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
答案 0 :(得分:268)
首先将两个操作数之一转换为浮点数。
v = (float)s / t;
演员阵容的优先级高于分区,因此在分组之前就会发生。
编译器会有效地自动将另一个操作数强制转换为浮点数,因为规则说如果任一操作数是浮点类型,则操作将是浮点操作,即使另一个操作数是整数。 Java Language Specification, §4.2.4和§15.17
答案 1 :(得分:11)
尝试:
v = (float)s / (float)t;
将浮点数转换为浮点数将允许进行浮点除法。
但你真的只需要施放一个。
答案 2 :(得分:4)
为了减轻对代码可读性的影响,我建议:
v = 1d* s/t;
答案 3 :(得分:3)
将其中一个整数转换为浮点数以强制使用浮点数学运算完成操作。否则,整数数学始终是首选。所以:
v = (float)s / t;
答案 4 :(得分:3)
你甚至可以只使用其中一个,但为了保持一致性,你可能想要显式地转换它们,所以像v =(float)s /(float)t这样的东西应该可行。
答案 5 :(得分:2)
您可以将分子或分母转换为浮动...
int操作通常返回int,因此您必须更改其中一个操作数。
答案 6 :(得分:1)
JLS标准
JLS 7 15.17.2. Division Operator /说:
整数除法向0舍入。也就是说,操作数n和d为二进制数字提升后的整数(第5.6.2节)产生的商是一个整数值q,其大小尽可能大,同时满足| d· q | ≤| n |。此外,当| n |时,q为正≥| d |并且n和d具有相同的符号,但是当| n |时q为负≥| d |和n和d有相反的符号。
这就是1/2
没有浮动的原因。
将{1>}中的任何一个转换为浮动,因为15.17. Multiplicative Operators说:
对操作数
执行二进制数字提升
和5.6.2. Binary Numeric Promotion说:
- 如果任一操作数的类型为double,则另一个操作数将转换为double。
- 否则,如果任一操作数的类型为float,则另一个操作数转换为float
答案 7 :(得分:0)
将一个整数/两个整数转换为float以强制使用浮点Math完成操作。否则,整数Math始终是首选。 所以:
1. v = (float)s / t;
2. v = (float)s / (float)t;
答案 8 :(得分:0)
试试这个:
class CalcV
{
float v;
float calcV(int s, int t)
{
float value1=s;
float value2=t;
v = value1 / value2;
return v;
} //end calcV
}