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 () 에 의해 반환 된 결과는 플로팅 포인트 정확도 제한으로 인해 오류를 유발합니다.
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); // 정확한 변환
?>
GMP (GNU Multi-Precision) Extension은 대규모 작업을 지원하고 이진 문자열에서 직접 변환하는 방법을 제공합니다.
<?php
$longBinary = "111111111111111111111111111111111111";
$decimal = gmp_strval(gmp_init($longBinary, 2), 10);
echo $decimal;
?>
이 방법은 간단하고 효율적이며 많은 수를 처리하는 데 적합합니다.
세분화에 의해 이진 문자열을 소수로 변환하는 것도 수행 될 수 있지만 구현은 더 복잡하고 비효율적입니다. BCMATH 또는 GMP가 권장됩니다.
Bindec ()는 짧은 이진 문자열의 변환에 적합하며, 부동 소수점 정확도 한계를 초과하면 오류가 발생합니다.
BCMATH 또는 GMP 확장을 사용하면 정확도 손실을 피하고 많은 수를 올바르게 변환 할 수 있습니다.