> 백엔드 개발 > PHP 튜토리얼 > PHP의 부동 소수점 소수점 이하 현상에 대한 심층적인 이해

PHP의 부동 소수점 소수점 이하 현상에 대한 심층적인 이해

WBOY
풀어 주다: 2024-03-08 16:02:02
원래의
338명이 탐색했습니다.

PHP의 부동 소수점 소수점 이하 현상에 대한 심층적인 이해

PHP는 웹 개발에 널리 사용되는 프로그래밍 언어로, 부동 소수점 숫자 처리는 항상 개발자가 주의해야 할 문제였습니다. 실제 개발 과정에서 우리는 부동 소수점 숫자가 동일하지 않은 현상을 자주 접하는데, 이는 컴퓨터에서 부동 소수점 숫자의 이진 형식으로 인해 발생하는 정밀도 손실로 인해 발생하는 경우가 많습니다. 이 기사에서는 PHP의 부동 소수점 부등식에 대해 자세히 알아보고 구체적인 코드 예제를 통해 설명하겠습니다.

먼저 간단한 예부터 시작해 보겠습니다. 두 개의 부동 소수점 숫자 $a = 0.1 + 0.2$ 및 $b = 0.3$가 있다고 가정합니다. 이 두 숫자는 동일해야 하지만 실제 프로그래밍에서는 동일하지 않을 수 있습니다. 다음 코드로 이를 확인해 보겠습니다.

$a = 0.1 + 0.2;
$b = 0.3;

if ($a == $b) {
    echo "相等";
} else {
    echo "不相等";
}
로그인 후 복사

위 코드를 실행하면 출력 결과가 "같지 않음"임을 알 수 있습니다. 컴퓨터에서 숫자 0.1, 0.2, 0.3은 이진수로 표현하면 무한히 반복되는 소수이기 때문에 완벽하게 정확하게 표현할 수는 없기 때문입니다. $a = 0.1 + 0.2$를 계산할 때 약간의 오류가 발생하여 $a$ 값이 실제로 0.3에 매우 가깝지만 정확히 0.3과 같지는 않은 숫자가 되었습니다.

이 문제를 더 깊이 이해하기 위해 다른 예를 살펴보겠습니다. 다음 코드를 고려해보세요.

$x = 0.7;
$y = 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1;
if ($x == $y) {
    echo "相等";
} else {
    echo "不相等";
}
로그인 후 복사

위 코드를 실행하면 출력 결과가 "같지 않음"임을 알 수 있습니다. 같은 이유로 0.1은 컴퓨터에서 정확하게 표현할 수 없고 $y$는 실제로 0.7보다 약간 큰 숫자이기 때문입니다. 따라서 $x$와 $y$의 값이 동일해야 한다고 예상하지만 부동 소수점 정밀도의 한계로 인해 실제로는 동일하지 않습니다.

이 문제를 해결하기 위해 우리는 일반적으로 항등 연산자를 직접 사용하는 대신 부동 소수점 비교에 오류 범위를 사용합니다. 예를 들어 위 코드를 다음과 같이 수정할 수 있습니다.

$x = 0.7;
$y = 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1 + 0.1;
$epsilon = 0.00001; // 定义一个误差范围

if (abs($x - $y) < $epsilon) {
    echo "相等";
} else {
    echo "不相等";
}
로그인 후 복사

허용되는 오류 범위를 도입함으로써 부동 소수점 숫자 비교를 보다 유연하게 수행할 수 있으므로 정밀도 문제로 인한 불평등을 피할 수 있습니다.

간단히 말하면, 부동 소수점 숫자가 동일하지 않은 현상은 PHP에서 흔히 발생하는 문제입니다. 부동 소수점 숫자의 이진 표현으로 인한 정밀도 손실로 인해 개발자는 이 상황을 처리하는 데 주의를 기울여야 합니다. 오류 범위를 합리적으로 설정하거나 다른 처리 방법을 채택함으로써 부동 소수점 수의 불평등 비교 문제를 효과적으로 해결하여 프로그램의 정확성과 안정성을 보장할 수 있습니다.

위 내용은 PHP의 부동 소수점 소수점 이하 현상에 대한 심층적인 이해의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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