JSON 형식에 사용되는 숫자 유형은 JavaScript를 기반으로 한 숫자 유형이며 정확도는 특정 제한이 있습니다. JavaScript의 수 유형은 IEEE 754 Double Precision Floating Point 번호 표준 (64 비트)을 기반으로하며, 표현할 수있는 최대 정확도는 15 ~ 17 비트 유의미입니다. JSON 데이터 에이 정밀 범위를 초과하는 숫자가 포함되면 변환 프로세스 중에 정밀도가 손실 될 수 있습니다.
PHP에서 JSON_DECODE는 JSON의 숫자를 플로팅 유형 ( 플로트 )으로 구문 분석하며 IEEE 754 표준을 기반으로합니다. 이 유형은 JavaScript의 숫자 유형과 정밀하게 다릅니다. 특히 매우 크거나 매우 작은 숫자.
예를 들어, JSON 데이터에 12345678901234567890 과 같은 숫자가 포함되어있는 경우 JSON_DECODE를 사용하여 디코딩 할 때 정확도 손실이 발생하여 결과가 부정확합니다.
숫자의 정확도를 더 잘 제어하기 위해 PHP는 JSON_DECODE 의 숫자 정확도를 처리하는 몇 가지 방법을 제공합니다.
JSON의 숫자가 플로트 정밀도 (예 : 큰 정수)의 범위를 초과 할 수있는 경우 JSON_DECODE를 호출 할 때 JSON_BIGINT_AS_STRING 옵션을 사용 하여이 많은 숫자를 플로팅 유형 대신 문자열로 구문 분석 할 수 있습니다. 문자열은 숫자 정보를 잃지 않기 때문에 정밀 손실을 피합니다.
<span><span><span class="hljs-variable">$json</span></span><span> = </span><span><span class="hljs-string">'{"big_number": 12345678901234567890}'</span></span><span>;
</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">json_decode</span></span><span>(</span><span><span class="hljs-variable">$json</span></span><span>, </span><span><span class="hljs-literal">false</span></span><span>, </span><span><span class="hljs-number">512</span></span><span>, JSON_BIGINT_AS_STRING);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$data</span></span><span>->big_number; </span><span><span class="hljs-comment">// 산출 "12345678901234567890"</span></span><span>
</span></span>
이러한 방식으로 PHP는 플로팅 값으로 변환하는 대신 12345678901234567890 을 문자열로 유지하여 수치 정확도의 손실을 피합니다.
또 다른 해결책은 JSON 데이터를 수신 한 후 다른 방식으로 정밀 제어를 수행하는 것입니다. 예를 들어, GMP (GNU 다중 정밀) 확장을 사용하여 많은 수를 처리하십시오. GMP Extension을 사용하면 임의의 정밀도의 정수를 처리 할 수 있으며 정확한 계산이 필요할 때 사용할 수 있습니다.
<span><span><span class="hljs-variable">$json</span></span><span> = </span><span><span class="hljs-string">'{"big_number": 12345678901234567890}'</span></span><span>;
</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">json_decode</span></span><span>(</span><span><span class="hljs-variable">$json</span></span><span>, </span><span><span class="hljs-literal">true</span></span><span>);
</span><span><span class="hljs-variable">$bigNumber</span></span><span> = </span><span><span class="hljs-title function_ invoke__">gmp_init</span></span><span>(</span><span><span class="hljs-variable">$data</span></span><span>[</span><span><span class="hljs-string">'big_number'</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">$bigNumber</span></span><span>); </span><span><span class="hljs-comment">// 산출 "12345678901234567890"</span></span><span>
</span></span>
이 예에서는 숫자를 문자열로 구문 분석하고 gmp를 사용하여 숫자 정확도가 손실되지 않도록합니다.
JSON 데이터 자체에 숫자와 문자열의 혼합이 포함 된 경우 JSON을 처리 할 때 데이터 유형을 명확하게 구별하는 것이 가장 좋습니다. 매우 크거나 작은 숫자를 포함하는 시나리오의 경우 JSON 데이터를 생성 할 때 적절한 데이터 형식을 사용하는 것이 가장 좋습니다. 과학적 표기법이나 문자열 형태를 사용하여 많은 수를 전달하여 정밀도 손실의 위험을 줄입니다.
<span><span><span class="hljs-variable">$json</span></span><span> = </span><span><span class="hljs-string">'{"big_number": "12345678901234567890"}'</span></span><span>;
</span><span><span class="hljs-variable">$data</span></span><span> = </span><span><span class="hljs-title function_ invoke__">json_decode</span></span><span>(</span><span><span class="hljs-variable">$json</span></span><span>, </span><span><span class="hljs-literal">true</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-variable">$data</span></span><span>[</span><span><span class="hljs-string">'big_number'</span></span><span>]; </span><span><span class="hljs-comment">// 산출 "12345678901234567890"</span></span><span>
</span></span>
이러한 방식으로, PHP 구문 분석 숫자의 부유 유형으로의 문제는 피하고 데이터의 무결성이 유지됩니다.
PHP에서, 부동 유형 숫자는 정확도를 잃을 수 있기 때문에 부동 유형을 비교할 때 부정확성이 발생할 수 있습니다. 이 문제를 피하기 위해, 특히 정밀도가 필요한 금융 또는 기타 계산과 관련하여 문자열 또는 정확한 숫자 유형을 비교에 사용할 수 있습니다.
JSON_BIGINT_AS_STRING 옵션을 사용하면 PHP가 JSON을 구문 분석 할 때 모든 큰 정수를 문자열로 처리하게됩니다. 이는 특히 많은 양의 데이터를 처리해야 할 때 성능에 영향을 줄 수 있습니다. 따라서 솔루션을 선택할 때는 데이터 정확도와 성능 간의 균형을 측정해야합니다.
JSON 데이터를 다룰 때, 디지털 정확도 문제는 특히 많은 수의 또는 고정밀 요구 사항과 관련하여 무시할 수없는 과제입니다. PHP는 JSON_BIGINT_AS_STRING 옵션을 사용하여 많은 숫자를 문자열로 구문 분석하거나 정확한 계산을 위해 GMP 확장을 사용하는 등이 문제를 해결하는 몇 가지 방법을 제공합니다. 실제 요구에 따라 적절한 처리 방법을 선택하면 데이터의 정확성과 시스템의 안정성을 보장 할 수 있습니다.