>백엔드 개발 >PHP 문제 >PHP json_encode의 정밀도 손실에 대해 이야기해 보겠습니다.

PHP json_encode의 정밀도 손실에 대해 이야기해 보겠습니다.

PHPz
PHPz원래의
2023-03-29 10:09:451154검색

PHP는 웹 애플리케이션 작성, 데이터베이스 처리, 스크립트 생성 및 서버 측 프로그래밍에 널리 사용되는 프로그래밍 언어입니다. 그중 json_encode는 PHP 배열과 개체를 JSON 문자열로 변환하는 데 사용되는 PHP의 매우 일반적인 함수입니다. 이 기능은 매우 편리한 도구이며 일상적인 프로그래밍에서 매우 자주 사용됩니다. 그러나 누군가는 이러한 문제에 직면할 수 있습니다. json_encode 함수를 사용하여 PHP 배열이나 개체를 JSON 문자열로 변환할 때 때때로 정밀도가 손실됩니다. 이 기사에서는 이 문제의 원인을 살펴보겠습니다.

먼저 JSON이 무엇인지 알아보겠습니다. JSON(JavaScript Object Notation)은 데이터 교환에 사용되는 텍스트 형식입니다. 읽고 이해하기 쉬운 매우 가벼운 형식입니다. JSON 형식은 키-값 쌍으로 구성되며 이러한 키-값 쌍에는 배열과 중첩 개체도 포함될 수 있습니다. PHP의 경우 json_encode 함수를 사용하여 배열과 개체를 JSON 형식의 문자열로 변환할 수 있고, json_decode 함수를 사용하여 JSON 형식의 문자열을 PHP 배열이나 개체로 변환할 수 있습니다.

그렇다면 json_encode 함수를 변환에 사용할 때 왜 정밀도 손실 문제가 발생하는 걸까요? 이는 부동 소수점 숫자를 처리할 때 json_encode 함수의 메커니즘으로 인해 발생합니다. PHP에서 부동 소수점 숫자는 일반적으로 IEEE 754 표준의 배정밀도 부동 소수점 형식으로 표현됩니다. JSON 형식에서 부동 소수점 숫자에는 소수 표현이라는 하나의 표현 방법만 있습니다. PHP 배열 또는 개체에 배정밀도 부동 소수점 데이터가 포함된 경우 json_encode 함수는 이를 JSON 문자열로 변환할 때 정밀도 손실을 유발하여 결과적으로 정밀도 손실이 발생합니다.

다음은 이 문제를 설명하는 간단한 예입니다.

$array = array(
    'foo' => 0.1,
    'bar' => 0.7,
    'baz' => 0.6 + 0.1
);

echo json_encode($array);

출력 결과는 다음과 같습니다.

{"foo":0.1,"bar":0.69999999999999996,"baz":0.7}

보시다시피 $array 배열에는 세 개의 부동 소수점 숫자 유형 데이터가 포함되어 있으며 그 중 하나는 0.6+0.1, json_encode입니다. 함수 변환시 0.7로 변환되어 정확도가 떨어지는 문제가 발생합니다. 다른 부동 소수점 유형의 데이터에서도 동일한 문제가 발생합니다.

그렇다면 이 문제를 어떻게 해결할 수 있을까요? 일반적으로 두 가지 방법이 있습니다.

1 number_format 함수를 사용하여 부동 소수점 숫자를 반올림합니다.

$array = array(
    'foo' => number_format(0.1, 2, '.', ''),
    'bar' => number_format(0.7, 2, '.', ''),
    'baz' => number_format(0.6 + 0.1, 2, '.', '')
);

echo json_encode($array);

출력 결과는 다음과 같습니다.

{"foo":"0.10","bar":"0.70","baz":"0.70"}

number_format 함수를 통해 부동 소수점 숫자를 반올림하면 정밀도 손실 문제를 해결할 수 있습니다. 그러나 이 접근 방식은 우아하지 않으며 각 부동 소수점 숫자에 대한 처리가 필요합니다.

2. bcmath 확장 함수를 사용하여 부동 소수점 숫자를 처리합니다.

if (!function_exists('json_encode_float')) {
    function json_encode_float($val) {
        $precision = ini_get('precision');
        ini_set('precision', 16);
        $encoded = json_encode($val);
        ini_set('precision', $precision);
        return $encoded;
    }
}

$array = array(
    'foo' => 0.1,
    'bar' => 0.7,
    'baz' => 0.6 + 0.1
);

echo json_encode_float($array);

출력 결과는 다음과 같습니다.

{"foo":0.1,"bar":0.7,"baz":0.7}

bcmath 확장 함수를 사용하면 정밀도 손실 문제를 방지하면서 정밀도를 더 높은 값으로 설정할 수 있습니다. 코드의 json_encode_float 함수는 json_encode 함수를 캡슐화한 것으로 부동 소수점 유형의 데이터를 처리하는 데 사용됩니다.

요약하자면, json_encode 함수의 정밀도 손실 문제는 부동 소수점 숫자를 처리할 때의 메커니즘으로 인해 발생합니다. 정밀도 손실을 방지하려면 number_format 함수를 통해 부동 소수점 숫자를 반올림하거나 bcmath 확장 함수를 사용하여 부동 소수점 숫자를 처리할 수 있습니다. 일상적인 프로그래밍에서 우리는 이 문제에 주의를 기울여야 하며 정밀도 손실을 피하기 위해 적절한 방법을 채택해야 합니다.

위 내용은 PHP json_encode의 정밀도 손실에 대해 이야기해 보겠습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.