How to make the division of 2 ints produce a float instead of another int?
JavaJava Problem Overview
In another Bruce Eckels exercise in calculating velocity, v = s / t
where s and t are integers. How do I make it so the division cranks out a float?
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
Java Solutions
Solution 1 - Java
Just cast one of the two operands to a float first.
v = (float)s / t;
The cast has higher precedence than the division, so happens before the division.
The other operand will be effectively automatically cast to a float by the compiler because the rules say that if either operand is of floating point type then the operation will be a floating point operation, even if the other operand is integral. Java Language Specification, §4.2.4 and §15.17
Solution 2 - Java
Try:
v = (float)s / (float)t;
Casting the ints to floats will allow floating-point division to take place.
You really only need to cast one, though.
Solution 3 - Java
Cast one of the integers to a float to force the operation to be done with floating point math. Otherwise integer math is always preferred. So:
v = (float)s / t;
Solution 4 - Java
To lessen the impact on code readabilty, I'd suggest:
v = 1d* s/t;
Solution 5 - Java
You can cast the numerator or the denominator to float...
int operations usually return int, so you have to change one of the operanding numbers.
Solution 6 - Java
You can cast even just one of them, but for consistency you may want to explicitly cast both so something like v = (float)s / (float)t should work.
Solution 7 - Java
Cast one of the integers/both of the integer to float to force the operation to be done with floating point Math. Otherwise integer Math is always preferred. So:
1. v = (float)s / t;
2. v = (float)s / (float)t;
Solution 8 - Java
JLS Standard
JLS 7 15.17.2. Division Operator / says:
> Integer division rounds toward 0. That is, the quotient produced for operands n and d that are integers after binary numeric promotion (§5.6.2) is an integer value q whose magnitude is as large as possible while satisfying |d · q| ≤ |n|. Moreover, q is positive when |n| ≥ |d| and n and d have the same sign, but q is negative when |n| ≥ |d| and n and d have opposite signs.
This is why 1/2
does not give a float.
Converting just either one to float as in (float)1/2
suffices because 15.17. Multiplicative Operators says:
> Binary numeric promotion is performed on the operands
and 5.6.2. Binary Numeric Promotion says:
> - If either operand is of type double, the other is converted to double. > - Otherwise, if either operand is of type float, the other is converted to float
Solution 9 - Java
Try this:
class CalcV
{
float v;
float calcV(int s, int t)
{
float value1=s;
float value2=t;
v = value1 / value2;
return v;
} //end calcV
}