[c#] C #에서 double을 int로 변환

우리 코드에는 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로 캐스팅하면 정수가 아닌 구성 요소가 버려집니다.


답변