2013-03-13 3 views
1

다음은이 문자열을 직렬화 해제하고자하는 문자열입니다.unseralize + php는 원래의 값으로 변환합니다.

$string3 = 'a:3:{i:0;a:2:{s:5:"value";d:4.0999999999999996;s:7:"players";a:2:{i:6;i:6;i:7;i:7;}}i:1;a:2:{s:5:"value";d:10.899999999999999;s:7:"players";a:1:{i:7;i:7;}}i:2;a:2:{s:5:"value";d:1.7763568394002505E-15;s:7:"players";N;}}'; 

는 그것을 결과

Array 
(
[0] => Array 
    (
     [value] => 4.1 // this value converted to 4.1 original was see in the string it was 4.0999999999999996 
     [players] => Array 
      (
       [6] => 6 
       [7] => 7 
      ) 

    ) 

[1] => Array 
    (
     [value] => 10.9 // this value converted to 10.9 original was see in the string it was 10.899999999999999 
     [players] => Array 
      (
       [7] => 7 
      ) 

    ) 

[2] => Array 
    (
     [value] => 1.7763568394003E-15 
     [players] => 
    ) 

) 

는 I하지 변환 원래 값을 원하는 4.1 10.9 등에 배열 값 변환 이하 준다.

+1

좋아요 ... 질문이 무엇입니까? –

+0

배열에 대한 의견보기 –

+0

unserialize http://php.net/manual/en/function.unserialize.php –

답변

1

컴퓨터가 정밀하게 수레를 다루기 어렵습니다. 세부 사항을 자세히 들여다 보지 않고 PHP는 부동 소수점 값의 최대 값에 대한 값을 설정했습니다. 이는 precision 구성 등록 정보에서 설정됩니다. 아마 14로 설정되어 있기 때문에 부동 소수점 수가 14 이상인 모든 부동 소수점은 반올림됩니다.

그렇다면 php.ini에서 precision 값을 늘리면됩니다. 또는 ini_set('precision', 20)으로 변경하십시오.

그 트릭을해야합니다.

+0

정밀도 설정은 serialize에 아무런 영향을 미치지 않습니다. 원래의 이진 값을 되 찾을 수있는 충분한 세부 사항을 제공하기 위해 많은 * 숫자를 저장해야하는 경우가 종종 있습니다 *. 이 경우 정밀도를 조정하는 것은 저장된 값을 직렬화하는 방법과 비슷하게 값을 표시하는 해킹 일뿐입니다. 그러나 원래 값은 * 4.1이었습니다. 그래서 정말, unserialize 잘 작동했다. – Boann

관련 문제