How to make the division of 2 ints produce a float instead of another int?

Java

Java 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
}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionphillView Question on Stackoverflow
Solution 1 - JavaAlnitakView Answer on Stackoverflow
Solution 2 - JavaanisopteraView Answer on Stackoverflow
Solution 3 - JavaJason CocoView Answer on Stackoverflow
Solution 4 - Javaspace programmerView Answer on Stackoverflow
Solution 5 - JavaJhonny D. Cano -Leftware-View Answer on Stackoverflow
Solution 6 - JavaUriView Answer on Stackoverflow
Solution 7 - JavaNikhil KumarView Answer on Stackoverflow
Solution 8 - JavaCiro Santilli Путлер Капут 六四事View Answer on Stackoverflow
Solution 9 - JavaSarath KumarView Answer on Stackoverflow