>백엔드 개발 >PHP 튜토리얼 >PHP의 부동 소수점 비교가 때때로 실패하는 이유는 무엇이며 이를 올바르게 비교할 수 있는 방법은 무엇입니까?

PHP의 부동 소수점 비교가 때때로 실패하는 이유는 무엇이며 이를 올바르게 비교할 수 있는 방법은 무엇입니까?

DDD
DDD원래의
2024-12-23 16:56:11702검색

Why Do Floating-Point Comparisons in PHP Sometimes Fail, and How Can We Correctly Compare Them?

PHP에서 부동 소수점 숫자 비교

PHP에서 부동 소수점 숫자를 비교할 때는 표현과 정밀도의 미묘한 차이를 처리하는 것이 중요합니다. 다음 코드에서 설명한 것처럼 이는 어려울 수 있습니다.

<?php
$a = 0.17;
$b = 1 - 0.83; // 0.17

if ($a == $b) {
    echo 'a and b are same';
} else {
    echo 'a and b are not same';
}
?>

이 코드에서는 $a와 $b가 동일한 값을 나타내므로 if 조건이 true일 것으로 예상할 수 있습니다. 그러나 예기치 않게 false로 평가되어 $a와 $b가 동일하지 않음을 나타냅니다.

비교가 실패하는 이유

이러한 불일치의 원인은 부동 소수점 숫자의 내부 표현에 있습니다. 컴퓨터에서. 이 숫자는 근사치이며 정밀도가 제한되어 있습니다. 부동 소수점 계산을 수행할 때 작은 반올림 오류가 누적되어 동등성을 비교할 때 예상치 못한 결과가 발생할 수 있습니다.

부동 소수점 비교 처리

이 문제를 해결하려면 다음을 사용하여 부동 소수점을 비교하는 것을 피해야 합니다. 동일한 값을 나타내는지 완전히 확신하지 않는 한 완전 항등 연산자(==)입니다. 대신, abs() 함수를 사용하여 허용 가능한 작은 허용 오차에 대해 두 값 간의 절대 차이를 비교하세요.

예를 들어 다음 코드를 사용하여 허용 오차 0.00001로 $a와 $b를 비교할 수 있습니다. :

if (abs(($a - $b) / $b) < 0.00001) {
    echo "a and b are same";
} else {
    echo "a and b are not same";
}

이 방법은 실용적인 목적으로 부동소수점을 비교할 수 있는 보다 안정적인 방법을 제공합니다.

위 내용은 PHP의 부동 소수점 비교가 때때로 실패하는 이유는 무엇이며 이를 올바르게 비교할 수 있는 방법은 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.