> 백엔드 개발 > PHP 튜토리얼 > PHP 부동 소수점 숫자 비교 방법

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

풀어 주다: 2023-04-08 13:38:02
앞으로
4065명이 탐색했습니다.

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에서도 동일한 문제가 발생합니다.

확장: >, <, >= 또는 <=

그렇다면 두 부동 소수점 숫자가 같은지 어떻게 비교해야 할까요?

위의 소개를 읽고 나면 두 개의 부동 소수점 숫자가 같은지 정확하게 비교할 수 있는 방법이 없다는 것을 알 수 있습니다! 따라서... 원하는 정확도 범위 내에서만 비교할 수 있습니다(예를 들어 위의 예에서는 $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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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