Computer >> 컴퓨터 >  >> 프로그래밍 >> PHP

PHP에서 부동 소수점(float) 값 비교하는 방법 완벽 가이드

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처럼 두 값의 차이가 허용 오차 범위 내인지 검사하는 방식도 널리 사용됩니다.

이처럼 상황에 맞는 비교 방법을 선택하면 부동 소수점 연산으로 인한 예상치 못한 버그를 효과적으로 예방할 수 있습니다.