우리 코드에는 int로 변환해야하는 double이 있습니다.
double score = 8.6;
int i1 = Convert.ToInt32(score);
int i2 = (int)score;
아무도 이유를 설명 할 수 있습니까 i1 != i2
?
내가 얻은 결과는 다음 i1 = 9
과 같습니다 i2 = 8
.
우리 코드에는 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
여기에서와 같이 실제 숫자 인 경우 에는 작동하지 않음 ).
score
이었다 8.5
대신 8.6
. 나는 따옴표를 포함하도록 답변을 업데이트했습니다. 입력 해 주셔서 감사합니다.
score
있다 NaN
거나 무한대 또는 유한하지만, 외부의 범위는 Int32
다음 Convert.ToInt32
예외가 발생합니다. Cast는을 반환 int
하지만 컨텍스트에 Int32.MinValue
있기 때문에 어떤 것이 (내 구현에서는 ) 알 수 있습니다 unchecked
. (당신이 checked
문맥에 있다면 , 캐스트는 이러한 경우에도 예외를 던질 것입니다.)
Double
유형 번호 10000000000.6
(100 억 포인트 6)는 "실제"숫자 라고 생각합니다 . int
그것에 캐스트를 사용하면 이상한 결과를 얻을 수 있습니다 ( checked
문맥에 있지 않는 한 , 아마도 그렇지 않을 것입니다).
캐스팅은 소수점 이하의 모든 것을 무시하므로 8.6은 8이됩니다.
Convert.ToInt32(8.6)
double이 가장 가까운 정수 (이 경우 9)로 반올림되도록하는 안전한 방법입니다.
제공된 예에서 소수점은 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로 캐스팅하면 정수가 아닌 구성 요소가 버려집니다.
Math.Truncate(score)
보다 명시 적으로 의도를 표현했습니다(int)score