<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 이 부분은 기사의 내용과 관련이 없습니다.,테스트 코드 또는 자리 표시 자 콘텐츠를 넣을 수 있습니다</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"이 기사를 읽을 수 있습니다\n"</span></span><span>;
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"------------------\n"</span></span><span>;
</span><span><span class="hljs-meta">?></span></span><span>
---
</span><span><span class="hljs-comment"># 사용 bindec 기능 시간,변환 중 정확도 손실을 피하는 방법?</span></span><span>
존재하다 PHP 가운데,`bindec` 함수는 이진 문자열을 소수점 숫자로 변환 할 수 있습니다。예를 들어:
```php
</span><span><span class="hljs-variable">$binary</span></span><span> = </span><span><span class="hljs-string">"1101"</span></span><span>;
</span><span><span class="hljs-variable">$decimal</span></span><span> = </span><span><span class="hljs-title function_ invoke__">bindec</span></span><span>(</span><span><span class="hljs-variable">$binary</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$decimal</span></span><span>; </span><span><span class="hljs-comment">// 산출 13</span></span><span>
</span></span>Bindec은 짧은 바이너리 숫자를 처리 할 때 매우 편리하지만 더 큰 이진수를 처리 할 때 정밀 손실 문제가 발생할 수 있습니다. 이는 PHP의 정수 유형과 부동 소수점 유형이 내부적으로 저장 될 때 크기 제한을 갖기 때문입니다. 일반적으로 64 비트 시스템에서 PHP 정수의 최대 값은 9223372036854775807 입니다.이 범위를 초과하는 것은 자동으로 플로팅 포인트 수로 변환되어 정확도가 손실됩니다.
GMP (GNU 다중 정밀도)는 고정밀 정수 계산을 제공하며 모든 길이의 바이너리 스트링을 안전하게 처리 할 수 있습니다.
<span><span><span class="hljs-variable">$binary</span></span><span> = </span><span><span class="hljs-string">"110110101010101010101010101010101010"</span></span><span>;
</span><span><span class="hljs-variable">$decimal</span></span><span> = </span><span><span class="hljs-title function_ invoke__">gmp_init</span></span><span>(</span><span><span class="hljs-variable">$binary</span></span><span>, </span><span><span class="hljs-number">2</span></span><span>); </span><span><span class="hljs-comment">// 이진을 변환하십시오 GMP 물체</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">gmp_strval</span></span><span>(</span><span><span class="hljs-variable">$decimal</span></span><span>); </span><span><span class="hljs-comment">// 산출十进制字符串</span></span><span>
</span></span>이런 식으로 이진수가 매우 크면 정확도가 손실되지 않습니다.
BCMATH는 고정밀 문자열 숫자 계산을 제공하며 큰 이진 숫자를 처리하는 데 사용될 수 있습니다.
<span><span><span class="hljs-variable">$binary</span></span><span> = </span><span><span class="hljs-string">"110110101010101010101010101010101010"</span></span><span>;
</span><span><span class="hljs-variable">$decimal</span></span><span> = </span><span><span class="hljs-string">'0'</span></span><span>;
</span><span><span class="hljs-variable">$length</span></span><span> = </span><span><span class="hljs-title function_ invoke__">strlen</span></span><span>(</span><span><span class="hljs-variable">$binary</span></span><span>);
</span><span><span class="hljs-keyword">for</span></span><span> (</span><span><span class="hljs-variable">$i</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>; </span><span><span class="hljs-variable">$i</span></span><span> < </span><span><span class="hljs-variable">$length</span></span><span>; </span><span><span class="hljs-variable">$i</span></span><span>++) {
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$binary</span></span><span>[</span><span><span class="hljs-variable">$i</span></span><span>] === </span><span><span class="hljs-string">'1'</span></span><span>) {
</span><span><span class="hljs-variable">$decimal</span></span><span> = </span><span><span class="hljs-title function_ invoke__">bcadd</span></span><span>(</span><span><span class="hljs-variable">$decimal</span></span><span>, </span><span><span class="hljs-title function_ invoke__">bcpow</span></span><span>(</span><span><span class="hljs-string">'2'</span></span><span>, (</span><span><span class="hljs-keyword">string</span></span><span>)(</span><span><span class="hljs-variable">$length</span></span><span> - </span><span><span class="hljs-variable">$i</span></span><span> - </span><span><span class="hljs-number">1</span></span><span>)));
}
}
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$decimal</span></span><span>; </span><span><span class="hljs-comment">// 산출十进制字符串</span></span><span>
</span></span>BCMATH는 GMP만큼 직접적이지 않지만 GMP 확장 없이도 사용할 수도 있습니다.
작은 이진수의 경우 Bindec을 직접 사용하는 것으로 충분합니다.
큰 이진수 또는 고정밀 계산의 경우 GMP 또는 BCMATH 확장을 사용하는 것이 좋습니다.
정확도 손실을 방지하기 위해 큰 정수를 저장하기 위해 부동 소수점 번호에 의존하지 마십시오.
위의 방법을 사용하면 유형 제한으로 인한 정밀 문제를 피하면서 PHP의 이진 문자열을 소수점으로 안전하게 변환 할 수 있습니다.
<? php //이 부분은 기사의 내용과 관련이 없습니다. 당신은 자리 표시자를 넣거나 결론을 내릴 수 있습니다. ?> <span></span>