PHP 개발에서는 종종이 의심에 직면합니다. Ceil () 함수를 사용하여 얻은 결과는 JSON_ENCODE () 에 의해 직렬화 된 후 결과 디코딩과 일치하지 않습니다. 이 현상이 발생하는 이유는 무엇입니까? 이 기사는 기본 수치 표현의 관점, JSON 인코딩 메커니즘 등의 이유를 분석하고 해당 예를 제시합니다.
Ceil () 함수는 상향 둥글게 사용되며 매개 변수보다 최소 정수 값을 반환합니다. 반환 값 유형은 플로트이며 결과가 정수이더라도 리턴 값은 여전히 부동 소수점 유형입니다.
<?php
$num = 4.2;
$result = ceil($num);
var_dump($result); // float(5)
?>
보시다시피, Ceil ()은 정수 5 대신 부동 소수점 번호 5.0을 반환합니다.
PHP의 부동 소수점 수는 IEEE 754 이중 정밀 표준을 기반으로하며 64 비트 바이너리의 숫자를 나타냅니다. 플로팅 포인트는 모든 소수점 소수점을 정확하게 나타낼 수 없으며 정확도 오류가 있습니다.
이로 인해 Ceil () 의 결과가 이론적으로 5.0 과 같은 정수이더라도 기본 바이너리 스토리지에는 매우 작은 오류가있을 수 있습니다.
JSON_ENCODE ()는 PHP의 부동 소수점 번호를 JSON 숫자 유형으로 변환합니다. JSON 자체는 정수와 부동 소수점 번호를 구별하지 않고 숫자 유형 만 구별합니다.
예를 들어:
<?php
$num = ceil(4.2);
$json = json_encode($num);
echo $json; // 산출 "5"
?>
$ num 은 PHP에서 부동 소수점 번호 5.0 이지만 JSON의 숫자 5 로 표시되며 소수점과 소수점은 제거됩니다.
JSON_DECODE ()을 사용하여 JSON 문자열을 구문 분석하면 json 문자열의 표현에 따라 숫자가 기본적으로 부동 소수점 번호 또는 정수로 변환됩니다.
<?php
$json = json_encode(ceil(4.2)); // "5"
$decoded = json_decode($json);
var_dump($decoded); // int(5)
?>
여기서 JSON_DECODE ()는 JSON에서 5를 정수 int (5) 로 변환하며, 이는 원래 PHP의 부동 소수점 플로트 (5) 와 다릅니다.
요약 :
Ceil () 의 반환은 항상 부동 소수점 번호입니다.
json_encode () 의 숫자 양식 출력은 소수점 부분을 제거합니다.
json_decode () 는 숫자 형태를 기반으로 정수 또는 부동 소수점 번호로 변환합니다.
따라서 Ceil ()은 플로팅 포인트 번호 플로트 (5)를 가져 오며, 이는 JSON 직렬화 및 디코딩 후 정수 int (5) 가 될 수 있습니다.
그렇기 때문에 두 가지 결과 유형과 두 가지의 표현이 보입니다.
<?php
$num = 4.2;
$ceilValue = ceil($num);
echo "ceil() 결과:";
var_dump($ceilValue); // float(5)
$json = json_encode($ceilValue);
echo "json_encode() 결과: $json\n"; // "5"
$decoded = json_decode($json);
echo "json_decode() 결과:";
var_dump($decoded); // int(5)
?>
산출:
ceil() 결과:float(5)
json_encode() 결과:5
json_decode() 결과:int(5)
Ceil () 의 반환 값을 정수 유형으로 유지하려면 사용 후 유형을 캐스팅 할 수 있습니다.
$intValue = (int)ceil($num);
JSON 구문 분석 후 숫자 유형의 자동 변환에주의하십시오. 필요한 경우 JSON을 연관 배열로 변환하려면 두 번째 매개 변수 $ ASSO = TRUE 를 켜면 처리하기가 더 편리합니다.
부동 소수점 번호와 JSON 번호의 차이점을 이해하고 다른 유형으로 인한 논리적 오류를 피하십시오.