현재 위치: > 최신 기사 목록> 부유 식 작업에서 IS_INFINITE의 일반적인 트랩을 피하십시오

부유 식 작업에서 IS_INFINITE의 일반적인 트랩을 피하십시오

gitbox 2025-05-26

PHP에서 부동 소수점 번호를 처리 할 때 IS_INFINITE ()는 변수가 무한한 지 여부를 결정하는 데 사용되는 함수입니다. 비록 의미론 자체이지만, 부동 소수점 수의 계산 특성과 PHP의 느슨한 유형 시스템으로 인해, 부적절하게 사용되면, 관찰하기 어려운 문제가 발생합니다. 이 기사는 is_infinite ()를 사용하여 부동 소수점 값을 판단 할 때 일반적인 함정을 탐구하고 이러한 문제를 피하기 위해 실용적인 제안을 제공합니다.

부동 소수점 번호의 무한 가치의 원천

무한 값은 일반적으로 다음 상황에 나타납니다.

  • 불법 제로 분해 작업 (예 : 1.0 / 0.0 )

  • 지수 폭발로 인한 오버플로 (예 : Exp (10000) )

  • 다른 언어 또는 시스템 자체의 가져온 데이터는 무한한 값 (예 : JSON, API 반환)이 있습니다.

이러한 경우는 PHP에서 무한한 것으로 간주되며 IS_INFINITE () 로 식별 할 수있는 INF 또는 -INF 값을 생성합니다.

 $val = 1.0 / 0.0;
if (is_infinite($val)) {
    echo "값은 무한히 큽니다";
}

트랩 1 : 계산에서 중간 값이 명시 적으로 감지되지 않습니다.

많은 개발자가 최종 결과에서 is_infinite () 만 호출하지만 중간 단계의 계산 결과는 무한 할 수 있습니다. 예를 들어:

 $a = 1e308;
$b = 1e308;
$c = $a * $b;

if (!is_infinite($c)) {
    echo "계산 보안";
} else {
    echo "오버플로가 발생했습니다";
}

위의 코드에서 $ a와 $ b 자체가 합법적이더라도 $ a * $ b 결과는 inf 입니다. 따라서 최종 결과를 보지 않고 임계 계산 단계에 검사를 삽입해야합니다.

트랩 2 : JSON 또는 외부 데이터 인터페이스와 상호 작용합니다

외부 API 또는 JSON에서 구문 분석 된 부동 소수점 값을 처리 할 때, INF 또는 -inf를 포함하는 데이터가 발생할 수 있습니다. php의 json_encode ()json_decode () 는 기본적으로 이러한 값을 올바르게 처리 할 수 ​​없습니다.

 $data = ['value' => INF];
$json = json_encode($data);
// 반품 false,왜냐하면 INF 불법입니다 JSON 값

이런 종류의 상황을 처리하려면 필터링 로직을 사용자 정의 할 수 있습니다.

 function safe_json_encode($data) {
    array_walk_recursive($data, function (&$item) {
        if (is_infinite($item)) {
            $item = ($item > 0) ? 'INF' : '-INF';
        }
    });
    return json_encode($data);
}

또는 외부 소스를 읽기 전에 확인하십시오.

 $json = file_get_contents('https://gitbox.net/api/data');
$data = json_decode($json, true);

if (is_infinite($data['value'])) {
    // 오류 처리를 수행하십시오
}

트랩 3 : 비교 및 ​​정렬에서 무한 값의 잘못 판단

무한 값으로 배열을 정렬하거나 비교하면 논리적 오류가 발생할 수 있습니다. 예를 들어:

 $values = [1.5, INF, 3.0];
sort($values);

비즈니스 논리에서 다음 판단이 발생하면 INF가 마지막으로 순위가 매겨 질 것입니다.

 if ($values[2] > 1000000) {
    // 그것이 실제로 범위를 벗어난 것을 의미하는지 여부?
}

이 경우 특정 임계 값과 비교하기보다는 무한인지 여부를 명확하게 결정해야합니다.

조언을 피하십시오

  1. 주요 작업에서 명시 적 점검 : is_infinite () 호출 모든 계산 후 극한 값으로 이어질 수 있습니다.

  2. 외부 데이터 정리 : 모든 부동 소수점 입력 값을 전제로 처리하거나 INF를 제거하거나 비즈니스 허용 가능한 최대 값으로 교체하십시오.

  3. 캡슐화 점검 기능 : 통일 된 부동산 지점 값 검증 방법을 설정하십시오.

 function is_valid_float($val) {
    return is_float($val) && !is_nan($val) && !is_infinite($val);
}
  1. 결과에 대한 비즈니스 제한 사항을 설정합니다. 예를 들어, 가격 및 가격과 같은 부동 소수점 값을 제한하십시오.

 if ($amount > 1e12 || is_infinite($amount)) {
    throw new Exception("잘못된 금액");
}

요약

PHP에서 is_infinite ()를 사용하는 것은 간단 해 보이지만 그 뒤에는 부동 소수점 정확도, 입력 검증 및 경계 처리와 같은 몇 가지 잠재적 위험이 있습니다. 플로팅 포인트 논리를 설계하고 경계 검사 및 데이터 검증 기능을 사용하여 런타임 중 예측할 수없는 행동 또는 보안 위험을 효과적으로 피하기 위해 개발자는 경계해야합니다. 플로팅 포인트 오버플로를 올바르게 식별하고 처리함으로써 시스템의 견고성과 안정성을 크게 향상시킬 수 있습니다.