우리 코드에는 int로 변환해야하는 double이 있습니다.
double score = 8.6;
int i1 = Convert.ToInt32(score);
int i2 = (int)score;
아무도 이유를 설명 할 수 있습니까 i1 != i2
?
내가 얻은 결과는 다음 i1 = 9
과 같습니다 i2 = 8
.
답변
Convert.ToInt32
라운드 때문에 :
반환 값 : 가장 가까운 32 비트 부호있는 정수로 반올림됩니다. 값이 두 정수 사이의 중간이면 짝수가 반환됩니다. 즉, 4.5는 4로 변환되고 5.5는 6으로 변환됩니다.
… 캐스트가 잘리는 동안 :
double 또는 float 값에서 정수 유형으로 변환하면 값이 잘립니다.
업데이트 : 추가 차이점은 아래 Jeppe Stig Nielsen의 의견을 참조하십시오 (그러나 score
여기에서와 같이 실제 숫자 인 경우 에는 작동하지 않음 ).
답변
캐스팅은 소수점 이하의 모든 것을 무시하므로 8.6은 8이됩니다.
Convert.ToInt32(8.6)
double이 가장 가까운 정수 (이 경우 9)로 반올림되도록하는 안전한 방법입니다.
답변
당신은 당신의 더블을 반올림하고 ist를 캐스팅 할 수 있습니다.
(int)Math.Round(myDouble);
답변
제공된 예에서 소수점은 8.6 입니다. 8.5 또는 9.5 였다면 i1 == i2 진술 이 사실 일 수 있습니다. 사실 8.5에서는 참이고 9.5에서는 거짓이었을 것입니다.
설명:
소수점 부분에 관계없이 두 번째 문 int i2 = (int)score
은 소수점 부분을 버리고 단순히 정수 부분을 반환합니다. 데이터 손실이 발생할 수 있으므로 매우 위험한 일입니다.
이제 첫 번째 진술에서 두 가지 일이 발생할 수 있습니다. 소수 부분이 5, 즉 절반이 지나면 결정을 내립니다. 반올림 또는 내림합니까? C #에서 Convert 클래스는 은행원의 반올림을 구현합니다. 더 자세한 설명 은 이 답변을 참조하십시오 . 간단히 말해서 숫자가 짝수이면 내림하고 홀수이면 내림합니다.
예 :
double score = 8.5;
int i1 = Convert.ToInt32(score); // 8
int i2 = (int)score; // 8
score += 1;
i1 = Convert.ToInt32(score); // 10
i2 = (int)score; // 9
답변
ToInt32 라운드. int로 캐스팅하면 정수가 아닌 구성 요소가 버려집니다.