PHP에서 두 개의 부동 소수점(float) 값을 비교하는 것은 겉보기에는 간단해 보이지만, 실제로는 몇 가지 주의할 점이 있습니다. 이 글에서는 기본적인 비교 연산자 사용법과 함께, 소수점 자릿수를 고려한 정확한 비교 방법까지 예제와 함께 살펴보겠습니다.
기본적인 부동 소수점 값 비교
가장 일반적인 방법은 == 비교 연산자를 사용하는 것입니다. 다음 예제를 확인해 보세요.
예제 1
<?php
$a = 2.5;
$b = 3.5;
echo $a;
echo "\n$b";
if($a == $b) {
echo "\n두 값은 같습니다!";
} else {
echo "\n두 값은 같지 않습니다.";
}
?>출력 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
2.5 3.5 두 값은 같지 않습니다.
위 예제에서 변수 $a는 2.5, $b는 3.5로 서로 다른 값을 가지고 있으므로, == 연산자의 비교 결과는 false가 되어 else 블록의 문장이 실행됩니다.
소수점 자릿수를 반올림하여 비교하기
부동 소수점 값은 내부적으로 이진수로 표현되기 때문에 미세한 오차가 발생할 수 있습니다. 따라서 소수점 아래 특정 자릿수까지만 비교하고 싶다면 PHP의 round() 함수를 활용하는 것이 좋습니다.
예제 2
<?php
$a = 1.967;
$b = 1.969;
echo $a;
echo "\n$b";
if((round($a, 2)) == (round($b, 2))) {
echo "\n두 값은 같습니다!";
} else {
echo "\n두 값은 같지 않습니다.";
}
?>출력 결과
위 코드를 실행하면 다음과 같은 결과가 출력됩니다.
1.967 1.969 두 값은 같습니다!
이 예제에서 $a(1.967)와 $b(1.969)는 원래 값이 서로 다르지만, round($a, 2)와 round($b, 2)를 통해 소수점 둘째 자리에서 반올림하면 각각 1.97이 됩니다. 따라서 두 값은 같다고 판단되어 if 블록의 문장이 출력됩니다.
부동 소수점 비교 시 주의사항
PHP에서 부동 소수점 값을 비교할 때는 다음 사항을 꼭 기억하세요.
- 정확한 동등 비교는 위험합니다: 부동 소수점은 이진 표현의 한계로 인해 0.1 + 0.2 === 0.3과 같은 직관에 어긋나는 결과가 나올 수 있습니다.
- round() 함수 활용:
round(값, 자릿수)형태로 사용하여 원하는 소수점 자릿수에서 반올림한 후 비교하면 오차 문제를 줄일 수 있습니다. - 오차 범위(Epsilon) 비교: 더 안전한 방법으로는
abs($a - $b) < 0.00001처럼 두 값의 차이가 허용 오차 범위 내인지 검사하는 방식도 널리 사용됩니다.
이처럼 상황에 맞는 비교 방법을 선택하면 부동 소수점 연산으로 인한 예상치 못한 버그를 효과적으로 예방할 수 있습니다.