> 백엔드 개발 > C++ > C# Float 표현식을 Int로 캐스팅하면 예기치 않은 결과가 생성되는 이유는 무엇입니까?

C# Float 표현식을 Int로 캐스팅하면 예기치 않은 결과가 생성되는 이유는 무엇입니까?

Patricia Arquette
풀어 주다: 2025-01-08 17:12:46
원래의
586명이 탐색했습니다.

Why Does Casting a C# Float Expression to an Int Produce Unexpected Results?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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