C# 부동 소수점을 정수로 변환하는 비정상적인 동작: 직접 변환과 변수 할당의 차이점
C#에서 개발자는 부동 소수점 표현식의 결과를 정수로 변환할 때 이상한 동작에 직면하는 경우가 많습니다. 예를 들어 다음 코드 조각을 고려해보세요.
<code class="language-csharp">int speed1 = (int)(6.2f * 10); float tmp = 6.2f * 10; int speed2 = (int)tmp;</code>
직관적으로 속도1과 속도2는 동일한 값을 가져야 합니다. 그러나 이는 사실이 아닙니다. 속도1은 61과 같고 속도2는 62와 같습니다.
차이점 설명
근본 원인은 직접 변환과 변수 할당의 미묘한 차이에 있습니다. speed1의 경우 6.2f * 10 표현식의 결과는 부동 소수점 값 61.999998입니다. 암시적으로 정수로 변환되면 이 값은 61로 잘립니다.
반면 tmp 변수는 부동 소수점 값 61.999998을 명시적으로 저장합니다. 명시적으로 정수로 변환되면 이 값은 가장 가까운 정수로 반올림되어 62가 됩니다.
중간 정밀도
이 차이점은 컴파일러에서 생성된 바이트코드를 분석할 때 더욱 흥미로워집니다. 첫 번째 경우에는 6.2f * 10이라는 표현이 바로 중간값이 됩니다. 두 번째 경우 컴파일러는 결과를 부동 소수점 변수에 저장하여 중간 단계를 생성합니다.
이러한 중간 저장 위치의 차이는 최종 결과의 정확성에 영향을 미칩니다. 컴파일러는 형식 유형(float)이 달리 암시하는 경우에도 정밀도가 더 높은 중간 값을 사용할 수 있도록 허용합니다. 컴파일러가 이 작업을 수행하는 경우 결과가 61로 잘려서 관찰된 차이가 발생할 수 있습니다.
이 문제를 방지하는 방법
이러한 경우 일관성을 보장하려면 다음 예와 같이 부동 소수점 표현식을 정수로 변환하기 전에 명시적으로 반올림하는 것이 좋습니다.
<code class="language-csharp">int speed3 = (int)Math.Round(6.2f * 10);</code>
위 내용은 C# 부동 표현식의 직접 형변환 및 변수 할당이 다른 정수 결과를 생성하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!