PHP 매뉴얼에는 다음과 같은 말이 있습니다: 두 개의 부동 소수점 숫자가 같은지 비교하지 마십시오.
컴퓨터 내부에서 부동 소수점 숫자를 처리하는 방식에 따라 부동 소수점 숫자는 100% 정확할 수 없으므로 부동 소수점 연산을 처리할 때 정밀도 손실 문제가 발생합니다. 예를 들어 다음 프로그램은 다음과 같습니다.
<?php $a = 15521.42; $b = 15480.3; $c = $a-$b; var_dump($c); //php4:float(41.120000000001) php5:float(41.12) var_dump($c == 41.12); //bool(false) ?>
첫 번째 출력 문: PHP4에서 출력 $c는 41.120000000001 또는 유사한 결과일 수 있으며 다음 1은 정밀도 손실의 일부입니다. PHP5에서는 이 문제에 대해 일부 "최적화"가 이루어졌습니다. 부정확한 부분은 출력 결과에 표시되지 않지만 동시에 이 문제를 무시하고 $c==41.12라고 생각합니다.
두 번째 출력문: false는 PHP4와 PHP5 모두에서 출력됩니다.
면책조항: 이는 PHP의 문제가 아니라 컴퓨터의 부동 소수점 숫자 처리 내부 문제입니다! C/JAVA에서도 동일한 문제가 발생합니다.
확장: >, 95ec6993dc754240360e28e0de8de30a= 또는 <=
그렇다면 두 부동 소수점 숫자가 같은지 어떻게 비교해야 할까요?
위의 소개를 읽고 나면 두 개의 부동 소수점 숫자가 같은지 정확하게 비교할 수 있는 방법이 없다는 것을 알 수 있습니다! 따라서... 원하는 정확도 범위 내에서만 비교할 수 있습니다(예를 들어 위의 예에서는 $c가 소수점 이하 두 자리 내에서 41.12와 같도록 비교하기만 하면 됩니다).
다음은 PHP 매뉴얼 댓글의 예입니다
nction floatcmp($f1,$f2,$precision = 10) {// are 2 floats equal $e = pow(10,$precision); $i1 = intval($f1 * $e); $i2 = intval($f2 * $e); return ($i1 == $i2); } function floatgtr($big,$small,$precision = 10) {// is one float bigger than another $e = pow(10,$precision); $ibig = intval($big * $e); $ismall = intval($small * $e); return ($ibig > $ismall); } function floatgtre($big,$small,$precision = 10) {// is on float bigger or equal to another $e = pow(10,$precision); $ibig = intval($big * $e); $ismall = intval($small * $e); return ($ibig >= $ismall); }
관련 권장사항:
PHP 비디오 튜토리얼: https://www.php.cn/course/list/29/type/2. HTML
위 내용은 PHP 부동 소수점 숫자 비교 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!