현재 위치: > 최신 기사 목록> Bindec ()를 사용할 때 플로팅 포인트 정밀 문제를 피하는 방법

Bindec ()를 사용할 때 플로팅 포인트 정밀 문제를 피하는 방법

M66 2025-06-02

php에서, bindec () 함수는 이진 문자열을 10 진수로 변환하는 데 사용됩니다. 기본 사용량은 매우 간단합니다.

 <?php
$binary = "1101";
$decimal = bindec($binary);
echo $decimal; // 산출 13
?>

그러나 이진 문자열이 매우 길면, 특히 PHP가 정확하게 표현할 수있는 범위를 초과하면 Bindec ()은 부동 소수점 정밀 제한으로 인해 오류를 초래할 수 있습니다. Bindec ()는 부동 소수점 번호 유형의 값을 반환하는 반면 PHP는 부동 소수점 번호 정확도가 제한되어 있으며 정확하게 표현할 수있는 가장 긴 정수 숫자는 약 15 자리이기 때문입니다.

정확도 문제가있는 이유는 무엇입니까?

PHP 플로팅 포인트 수는 IEEE 754 이중 정밀 표준을 기반으로하며, 정확도 제한은 바이너리 스트링이 특정 길이를 초과하면 변환 결과가 반올림되어 부정확 한 값을 초래한다는 것을 의미합니다. 예를 들어:

 <?php
$longBinary = "111111111111111111111111111111111111"; // 35비트 바이너리
echo bindec($longBinary); // 결과가 정확하지 않을 수 있습니다
?>

이 경우 Bindec () 에 의해 반환 된 결과는 플로팅 포인트 정확도 제한으로 인해 오류를 유발합니다.

정확도 오류를 피하는 방법은 무엇입니까?

솔루션 1 : BCMATH를 사용하여 수동 변환을 확장하십시오

PHP의 BCMATH 확장은 임의의 길이의 수치 연산을 지원하며, 이는 부동 소수점 정확도의 손실을 피하기 위해 이진에서 10 진수로 수동으로 구현하는 데 사용할 수 있습니다.

 <?php
function bindec_bcmath(string $binary): string {
    $decimal = '0';
    $len = strlen($binary);
    for ($i = 0; $i < $len; $i++) {
        $decimal = bcmul($decimal, '2');
        if ($binary[$i] === '1') {
            $decimal = bcadd($decimal, '1');
        }
    }
    return $decimal;
}

$longBinary = "111111111111111111111111111111111111";
echo bindec_bcmath($longBinary); // 정확한 변환
?>

해결책 2 : GMP 확장을 사용하십시오

GMP (GNU Multi-Precision) Extension은 대규모 작업을 지원하고 이진 문자열에서 직접 변환하는 방법을 제공합니다.

 <?php
$longBinary = "111111111111111111111111111111111111";
$decimal = gmp_strval(gmp_init($longBinary, 2), 10);
echo $decimal;
?>

이 방법은 간단하고 효율적이며 많은 수를 처리하는 데 적합합니다.

솔루션 3 : 사용자 정의 세분화 변환 (권장되지 않음)

세분화에 의해 이진 문자열을 소수로 변환하는 것도 수행 될 수 있지만 구현은 더 복잡하고 비효율적입니다. BCMATH 또는 GMP가 권장됩니다.

요약

  • Bindec ()는 짧은 이진 문자열의 변환에 적합하며, 부동 소수점 정확도 한계를 초과하면 오류가 발생합니다.

  • BCMATH 또는 GMP 확장을 사용하면 정확도 손실을 피하고 많은 수를 올바르게 변환 할 수 있습니다.