Computer >> 컴퓨터 >  >> 프로그램 작성 >> PHP

PHP의 부동 소수점 값 비교.

<시간/>

PHP에서 부동 소수점 값이 같은지 테스트하는 것은 문제가 됩니다. 한 부동 소수점 숫자가 다른 부동 소수점 숫자와 같은지 확인할 때 PHP가 실패하기 때문입니다. 부동 소수점 숫자가 동일한 값을 갖는 것처럼 보인다는 사실에도 불구하고 실제로 동일할 필요는 없습니다. 따라서 이 기사에서는 부동 소수점 숫자와 이 문제를 피하기 위한 다양한 절차를 비교하여 우리가 직면한 문제를 설명합니다.

예시

간단한 예를 들어 이를 테스트해 보겠습니다.

<?php
   $a = 0.14;
   $b = 1 - 0.86; //0.14
   if($a == $b ){
      echo 'a and b are same';
   }
   else {
      echo 'a and b are not same';
   }
?>

출력:

a and b are not same.

설명:

이 코드에서는 $a와 $b가 같더라도 if 조건 대신 else 조건이 실행됩니다. 내부적으로 표현되는 방식은 부동 소수점 값의 특성 때문입니다. 이 문제를 실시간으로 피하기 위해 PHP의 다양한 경우에 대해 논의해 보겠습니다.

사례 1:

컴퓨터 시스템에서 계산의 가장 작은 차이를 사용하여 부동 소수점 값의 비교를 보여줍니다.

예:

<?php
   $val1 = 2.183459;
   $val2 = 2.183450;
   $epsilon = 0.00001;
   if(abs($val1 - $val2) < $epsilon) {
      echo "True";
   }
   else {
      echo "False";
   }
?>

출력:

True

설명:

여기서 우리는 엡실론과 함께 두 개의 부동 소수점 변수 val1 및 val2를 사용하고 있습니다. 그런 다음 abs()라는 기본 함수를 사용하여 변수(val1 및 val2)의 절대 차이를 취합니다. 이 코드는 절대값을 제공하지만 문제는 우리가 절대값을 취하는 이유입니다. 정답은 두 값이 소수점 이하 자릿수와 정밀도 값 5까지 동일한 것을 알 수 있는데, 이는 PHP에서 비교 분석하기 어렵습니다.

사례 2:

round() 함수 사용.

<?php
   $val1 = 9 - 6.2;
   $val2 = 1.8;
   var_dump(round($val1, 2) == round($val2, 2));
?>

출력:

bool(true)

설명:

여기서 우리는 두 개의 부동 소수점 변수 val1과 val2를 사용하고 있습니다. 그런 다음 소수점 이하 두 자리까지 부동 값을 반올림한 다음 비교하는 round()라는 미리 정의된 함수를 사용합니다. 여기에서 사전 정의된 round() 함수를 사용하여 올바른 방식으로 예상 결과를 얻고 있습니다.