How to make the division of 2 ints produce a float instead of another int?
Sophia Terry
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 1 9 Answers
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
3Try:
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.
1Cast 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; To lessen the impact on code readabilty, I'd suggest:
v = 1d* s/t; 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.
1You 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.
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; 1 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
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
}