views:

246

answers:

4

I coded some calculation stuff (I copied below a really simplifed example of what I did) like CASE2 and got bad results. Refactored the code like CASE1 and worked fine. I know there is an implicit cast in CASE 2, but not sure of the full reason. Any one could explain me what´s exactly happening below?

  //CASE 1, result 5.5
    double auxMedia = (5 + 6);
    auxMedia = auxMedia / 2;

    //CASE 2, result 5.0
    double auxMedia1 = (5 + 6) / 2;

    //CASE 3, result 5.5
    double auxMedia3 = (5.0 + 6.0) / 2.0;

    //CASE 4, result 5.5
    double auxMedia4 = (5 + 6) / 2.0;

My guess is that /2 in CASE2 is casting (5 + 6) to int and causing round of division to 5, then casted again to double and converted to 5.0.

CASE3 and CASE 4 also fixes the problem.

+12  A: 
  1. 5 + 6 is integer 11; which you then cast to double (in the assignment) and divide by two; 5.5
  2. 5 + 6 is integer 11; integer 11 / 2 = 5 under integer arithmetic, which you then cast to double (in the assignment)
  3. 5.0 + 6.0 is double 11.0; divide by double 2.0 giving double 5.5
  4. 5 + 6 is integer 11; there is an implicit cast to double 11.0 for the division, then divide double 2.0 giving double 5.5
Marc Gravell
Marc is correct. If your second line was was `auxMedia = auxMedia / 2.0` then you would get the result you expect since `2.0` is read as a double and `2` is read as an int (it drops off any decimal digits - doesn't even round).
Jaxidian
+1  A: 
//CASE 2, result 5.0
double auxMedia1 = (5 + 6) / 2;

The result of the (5 + 6) operation is integer. Because both operands are of type integer. Then, the compiler performs 11 / 2, where both operand are also integers. The result of the last division is obviously 5, because it is an integer division (don't know the proper English word).

n535
+1  A: 

You are correct. CASE 2 uses integer arithmetic until the assignment is made. You can also fix the problem by making an explicit cast:

double auxMedia1 = ((double) (5 + 6)) / 2;
Keltex
+3  A: 

To expand on Marc's (correct) answer a bit, whole numbers are interpreted as integer, whereas numbers with decimal points are interpreted as double. To declare a whole number as a literal double, append a "D" to it:

        //CASE 2b, result 5.5
        double auxMedia2b = (5D + 6D) / 2;
Jamie Ide