开发者

Explanation of casting/conversion int/double in C#

开发者 https://www.devze.com 2022-12-25 01:56 出处:网络
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 cas

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.开发者_JAVA百科

CASE3 and CASE 4 also fixes the problem.


  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


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;


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;


//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).

0

精彩评论

暂无评论...
验证码 换一张
取 消