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() 함수를 사용하여 올바른 방식으로 예상 결과를 얻고 있습니다.