In our code we have a double that we need to convert to an int.
double score = 8.6;
int i1 = Convert.ToInt32(score);
int i2 = (int)score;
Can anyone explain me why i1 != i2
?
The result that I get is that: i1 = 9
and i2 = 8
.
In our code we have a double that we need to convert to an int.
double score = 8.6;
int i1 = Convert.ToInt32(score);
int i2 = (int)score;
Can anyone explain me why i1 != i2
?
The result that I get is that: i1 = 9
and i2 = 8
.
you can round your double and cast ist:
ToInt32 rounds. Casting to int just throws away the non-integer component.
Because
Convert.ToInt32
rounds:...while the cast truncates:
Update: See Jeppe Stig Nielsen's comment below for additional differences (which however do not come into play if
score
is a real number as is the case here).Casting will ignore anything after the decimal point, so 8.6 becomes 8.
Convert.ToInt32(8.6)
is the safe way to ensure your double gets rounded to the nearest integer, in this case 9.In the provided example your decimal is 8.6. Had it been 8.5 or 9.5, the statement i1 == i2 might have been true. Infact it would have been true for 8.5, and false for 9.5.
Explanation:
Regardless of the decimal part, the second statement,
int i2 = (int)score
will discard the decimal part and simply return you the integer part. Quite dangerous thing to do, as data loss might occur.Now, for the first statement, two things can happen. If the decimal part is 5, that is, it is half way through, a decision is to be made. Do we round up or down? In C#, the Convert class implements banker's rounding. See this answer for deeper explanation. Simply put, if the number is even, round down, if the number is odd, round up.
E.g. Consider: