C #에서 double을 int로 변환


103

우리 코드에는 int로 변환해야하는 double이 있습니다.

double score = 8.6;
int i1 = Convert.ToInt32(score);
int i2 = (int)score;

아무도 이유를 설명 할 수 있습니까 i1 != i2?

내가 얻은 결과는 다음 i1 = 9과 같습니다 i2 = 8.


5
Math.Truncate(score)보다 명시 적으로 의도를 표현했습니다(int)score
Lu55

3
그러나 Math.Truncate는 정수가 아닌 이중 또는 소수를 반환합니다.
Sergioet

답변:


164

Convert.ToInt32라운드 때문에 :

반환 값 : 가장 가까운 32 비트 부호있는 정수로 반올림됩니다. 값이 두 정수 사이의 중간이면 짝수가 반환됩니다. 즉, 4.5는 4로 변환되고 5.5는 6으로 변환됩니다.

... 캐스트가 잘리는 동안 :

double 또는 float 값에서 정수 유형으로 변환하면 값이 잘립니다.

업데이트 : 추가 차이점은 아래 Jeppe Stig Nielsen의 의견을 참조하십시오 (그러나 score여기에서와 같이 실제 숫자 인 경우 에는 작동하지 않음 ).


6
귀하의 링크는 실제로이를 가장 잘 설명하며, round vs truncate만큼 간단하지 않습니다. Type : System.Int32 값, 가장 가까운 32 비트 부호있는 정수로 반올림. 값이 두 정수 사이의 중간이면 짝수가 반환됩니다. 즉, 4.5는 4로, 5.5는 6으로 변환됩니다.
ericosg

@ericosg 다음과 같은 경우 네, 그 차이를 마스크 것 score이었다 8.5대신 8.6. 나는 따옴표를 포함하도록 답변을 업데이트했습니다. 입력 해 주셔서 감사합니다.
Jon

5
그리고 경우가 score있다 NaN거나 무한대 또는 유한하지만, 외부의 범위는 Int32다음 Convert.ToInt32예외가 발생합니다. Cast는을 반환 int하지만 컨텍스트에 Int32.MinValue있기 때문에 어떤 것이 (내 구현에서는 ) 알 수 있습니다 unchecked. (당신이 checked문맥에 있다면 , 캐스트는 이러한 경우에도 예외를 던질 것입니다.)
Jeppe Stig Nielsen

@JeppeStigNielsen : 입력 해 주셔서 감사합니다. 답변을 업데이트하여 이에 대해서도 언급했습니다.
Jon

좋은. 하지만 Double유형 번호 10000000000.6(100 억 포인트 6)는 "실제"숫자 라고 생각합니다 . int그것에 캐스트를 사용하면 이상한 결과를 얻을 수 있습니다 ( checked문맥에 있지 않는 한 , 아마도 그렇지 않을 것입니다).
Jeppe Stig Nielsen

13

캐스팅은 소수점 이하의 모든 것을 무시하므로 8.6은 8이됩니다.

Convert.ToInt32(8.6) double이 가장 가까운 정수 (이 경우 9)로 반올림되도록하는 안전한 방법입니다.


1
보너스 질문 -의 값 경우의 무슨 더블 으로 밀어 너무 커서 INT ? 즉, int.MAX_VAL 보다 높으면 ?
Konrad Viltersten 2016 년

1
@KonradViltersten 예외를 던집니다 . Int32에 대해 값이 너무 크거나 너무 작습니다.
Vamsi

11

당신은 당신의 더블을 반올림하고 ist를 캐스팅 할 수 있습니다.

(int)Math.Round(myDouble);

4
문제는 이제 어떻게 만드는지 i1 == i2였습니다. 문제는 그들이 평등하지 않은지 에 관한 것이 었습니다. 비추천.
Adam

5

제공된 예에서 소수점은 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

2

ToInt32 라운드. int로 캐스팅하면 정수가 아닌 구성 요소가 버려집니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.