.NET의 배정밀도 곱셈 정확도 문제에 대한 자세한 설명
C#에서 double i = 10 * 0.69;
식의 결과는 i
에 예상되는 6.9 대신 6.89999999999999995 값이 할당된다는 것입니다. 이는 다음과 같은 질문을 제기합니다. .NET의 배정밀도 곱셈에 문제가 있습니까?
이진 표현과 부동 소수점 연산
이 동작을 이해하려면 이진 표현과 부동 소수점 산술의 미묘함을 깊이 이해해야 합니다. 부동 소수점 형식은 대략적으로 실수를 유한한 이진 값으로 나타내므로 정밀도 제한이 발생할 수 있습니다.
단순해 보이는 0.69는 이진수로 정확하게 표현할 수 없습니다. 이진수의 무한 반복 시퀀스가 필요합니다. double
데이터 유형에 저장된 이진 표현은 대략 0.69입니다.
컴파일러 최적화 및 저장 상수
제공된 코드 조각에서 컴파일러는 곱셈을 수행하고 그 결과를 실행 파일에 상수로 저장하여 표현식을 최적화합니다. 이는 컴파일 타임에 값이 알려지기 때문입니다. 저장된 값은 6.9의 부동 소수점 근사치로 실제 값보다 약간 작습니다.
해결 방법 및 대체 데이터 유형
이 문제를 해결하고 더 정확한 결과를 얻으려면 반복되지 않는 소수 값을 더 높은 정밀도로 표현하도록 설계된 decimal
데이터 유형을 사용할 수 있습니다. decimal i = 10m * 0.69m;
표현식을 사용하면 6.9m이 생성됩니다.
위 내용은 .NET에서 이중 곱셈이 깨졌나요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!