>  기사  >  백엔드 개발  >  PHP 부동 소수점 숫자 비교 방법

PHP 부동 소수점 숫자 비교 방법

尚
앞으로
2020-03-25 09:20:513993검색

PHP 부동 소수점 숫자 비교 방법

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

성명:
이 기사는 oschina.net에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제