현재 위치: > 최신 기사 목록> JSON_DECODE 기능을 사용할 때 JSON에서 수치 정밀 문제를 올바르게 처리하는 방법은 무엇입니까?

JSON_DECODE 기능을 사용할 때 JSON에서 수치 정밀 문제를 올바르게 처리하는 방법은 무엇입니까?

gitbox 2025-09-02

1. 디지털 정확도 문제가 발생하는 이유는 무엇입니까?

JSON 형식에 사용되는 숫자 유형은 JavaScript를 기반으로 한 숫자 유형이며 정확도는 특정 제한이 있습니다. JavaScript의 유형은 IEEE 754 Double Precision Floating Point 번호 표준 (64 비트)을 기반으로하며, 표현할 수있는 최대 정확도는 15 ~ 17 비트 유의미입니다. JSON 데이터 에이 정밀 범위를 초과하는 숫자가 포함되면 변환 프로세스 중에 정밀도가 손실 될 수 있습니다.

PHP에서 JSON_DECODE는 JSON의 숫자를 플로팅 유형 ( 플로트 )으로 구문 분석하며 IEEE 754 표준을 기반으로합니다. 이 유형은 JavaScript의 숫자 유형과 정밀하게 다릅니다. 특히 매우 크거나 매우 작은 숫자.

예를 들어, JSON 데이터에 12345678901234567890 과 같은 숫자가 포함되어있는 경우 JSON_DECODE를 사용하여 디코딩 할 때 정확도 손실이 발생하여 결과가 부정확합니다.

2. 디지털 정확도 문제를 해결하는 방법은 무엇입니까?

숫자의 정확도를 더 잘 제어하기 위해 PHP는 JSON_DECODE 의 숫자 정확도를 처리하는 몇 가지 방법을 제공합니다.

2.1 JSON_BIGINT_AS_STRING 옵션 사용

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>-&gt;big_number;  </span><span><span class="hljs-comment">// 산출 "12345678901234567890"</span></span><span>
</span></span>

이러한 방식으로 PHP는 플로팅 값으로 변환하는 대신 12345678901234567890 을 문자열로 유지하여 수치 정확도의 손실을 피합니다.

2.2 디지털 정확도의 수동 처리

또 다른 해결책은 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를 사용하여 숫자 정확도가 손실되지 않도록합니다.

2.3 적절한 데이터 형식 사용

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 구문 분석 숫자의 부유 유형으로의 문제는 피하고 데이터의 무결성이 유지됩니다.

3. 다른 예방 조치

3.1 부동 유형 비교

PHP에서, 부동 유형 숫자는 정확도를 잃을 수 있기 때문에 부동 유형을 비교할 때 부정확성이 발생할 수 있습니다. 이 문제를 피하기 위해, 특히 정밀도가 필요한 금융 또는 기타 계산과 관련하여 문자열 또는 정확한 숫자 유형을 비교에 사용할 수 있습니다.

3.2 성능 고려 사항

JSON_BIGINT_AS_STRING 옵션을 사용하면 PHP가 JSON을 구문 분석 할 때 모든 큰 정수를 문자열로 처리하게됩니다. 이는 특히 많은 양의 데이터를 처리해야 할 때 성능에 영향을 줄 수 있습니다. 따라서 솔루션을 선택할 때는 데이터 정확도와 성능 간의 균형을 측정해야합니다.

4. 요약

JSON 데이터를 다룰 때, 디지털 정확도 문제는 특히 많은 수의 또는 고정밀 요구 사항과 관련하여 무시할 수없는 과제입니다. PHP는 JSON_BIGINT_AS_STRING 옵션을 사용하여 많은 숫자를 문자열로 구문 분석하거나 정확한 계산을 위해 GMP 확장을 사용하는 등이 문제를 해결하는 몇 가지 방법을 제공합니다. 실제 요구에 따라 적절한 처리 방법을 선택하면 데이터의 정확성과 시스템의 안정성을 보장 할 수 있습니다.