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>
d
은 double
유형이므로 double
이 변환되고 반올림된 값이 정수로 잘려 일반적으로 값이 62가 됩니다.
부동 소수점 식 변환에서 예기치 않은 동작은 C# 부동 소수점 처리의 미묘한 측면입니다. 예상치 못한 결과를 방지하고 숫자 유형 간의 정확한 변환을 보장하려면 이러한 미묘한 차이를 이해하는 것이 중요합니다.
위 내용은 C#에서 부동 식을 정수로 캐스팅하면 메서드에 따라 다른 결과가 생성되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!