> 백엔드 개발 > C++ > C#에서 부동 식을 정수로 캐스팅하면 메서드에 따라 다른 결과가 생성되는 이유는 무엇입니까?

C#에서 부동 식을 정수로 캐스팅하면 메서드에 따라 다른 결과가 생성되는 이유는 무엇입니까?

Mary-Kate Olsen
풀어 주다: 2025-01-08 17:26:40
원래의
444명이 탐색했습니다.

Why Does Casting a Float Expression to an Integer in C# Produce Different Results Depending on the Method?

C# 부동 소수점을 정수로 변환하는 비정상적인 동작

다음 코드 조각은 C#에서 부동 소수점을 정수로 변환하는 예기치 않은 동작을 보여줍니다.

<code class="language-csharp">int speed1 = (int)(6.2f * 10);
float tmp = 6.2f * 10;
int speed2 = (int)tmp;</code>
로그인 후 복사

놀랍게도 speed1의 값은 61이고 speed2의 값은 62입니다. 둘 다 결과가 62일 것으로 예상하는데도 마찬가지입니다. 자세히 살펴보면 speed1에서 부동 소수점 표현식 6.2f * 10이 정수로 잘리기 전에 암시적으로 double 유형으로 변환되어 결과가 61이라는 것을 알 수 있습니다.

그러나 speed2에서는 6.2f * 10의 결과가 float 변수 tmp에 명시적으로 대입됩니다. 이 중간 단계에는 값을 가장 가까운 float 값인 62로 반올림한 다음 정수로 변환하는 작업이 포함됩니다.

두 작업의 주요 차이점은 중간 표현입니다. 첫 번째 경우, 컴파일러는 부동 소수점 표현식에 대해 더 높은 정밀도 표현을 예약하여 잘림을 발생시키고 값 61을 생성하도록 선택할 수 있습니다. 그러나 두 번째 경우에는 명시적인 float 할당으로 인해 반올림이 적용되어 값이 62가 됩니다.

다음 작업에서:

<code class="language-csharp">double d = 6.2f * 10;
int tmp2 = (int)d;</code>
로그인 후 복사

ddouble 유형이므로 double이 변환되고 반올림된 값이 정수로 잘려 일반적으로 값이 62가 됩니다.

부동 소수점 식 변환에서 예기치 않은 동작은 C# 부동 소수점 처리의 미묘한 측면입니다. 예상치 못한 결과를 방지하고 숫자 유형 간의 정확한 변환을 보장하려면 이러한 미묘한 차이를 이해하는 것이 중요합니다.

위 내용은 C#에서 부동 식을 정수로 캐스팅하면 메서드에 따라 다른 결과가 생성되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿