C# 부동 소수점 표현식: 부동 소수점을 정수로 변환할 때 예기치 않은 동작
C#에서는 부동 소수점 표현식의 결과를 정수로 캐스팅할 때 예기치 않은 동작이 발생할 수 있습니다. 다음 코드를 고려해보세요:
<code class="language-csharp">int speed1 = (int)(6.2f * 10); float tmp = 6.2f * 10; int speed2 = (int)tmp;</code>
직관적으로 속도1과 속도2는 동일한 값을 포함해야 합니다. 그러나 실제 결과는 다음과 같습니다.
<code>speed1 = 61 speed2 = 62</code>
이 예외는 수행된 작업 순서로 인해 발생합니다. speed1에서는 곱셈의 결과(6.2f * 10)가 즉시 정수로 변환되어 잘린 값 61이 생성됩니다.
반대로 speed2에서는 곱셈 결과가 tmp에 부동 소수점 숫자로 할당되어 부동 소수점으로 암시적으로 변환하는 동안 반올림이 발생합니다. 이 반올림된 값인 62는 정수로 변환되어 올바른 결과를 얻습니다.
이 동작을 이해하려면 부동 소수점 숫자(예: 6.2f)가 정확한 수학적 값이 아니라 근사치라는 점을 인식하는 것이 중요합니다. 따라서 부동 소수점 숫자에 대한 산술 연산은 반올림으로 인해 정밀도가 손실될 수 있습니다.
(int)(6.2f 10) 의 경우 결과가 공식적으로 부동 소수점 숫자이더라도 컴파일러는 (선택적으로) 6.2f 10의 정밀도를 유지할 수 있습니다. 이를 통해 보다 정확한 결과를 얻을 수 있습니다. 그러나 이 최적화가 구현되지 않으면 표현식이 배정밀도 부동 소수점 숫자로 캐스팅되어 정밀도가 손실될 수 있습니다.
반대로, tmp = 6.2f * 10에 대한 할당은 정수 변환 전에 명시적으로 반올림을 강제합니다. 이는 다양한 시스템에서 일관된 결과를 보장합니다.
따라서 이러한 예외를 방지하려면 일반적으로 부동 소수점 숫자를 정수로 변환할 때 Math.Round와 같은 명시적인 반올림 함수를 사용하는 것이 좋습니다.
위 내용은 C# Float 표현식을 Int로 캐스팅하면 예기치 않은 결과가 생성되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!