2013-03-13 121 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] => 
    ) 

) 

其轉換爲4.1和10.9等欲原始值不轉換數組值。

+1

好的......問題是什麼? – 2013-03-13 09:34:13

+0

看到陣列上的評論 – 2013-03-13 09:35:03

+0

反序列化http://php.net/manual/en/function.unserialize.php – 2013-03-13 09:37:10

回答

1

計算機很難精確處理漂浮物。沒有深入細節,PHP只是爲最大數量的浮點值設置了一個值。這在precision配置屬性中設置。它可能設置爲14,因此每個具有14個或更多浮點數的浮點數將被舍入。

所以你需要做的是增加你的php.ini中的precision值。或者用ini_set('precision', 20)進行更改。

這應該做的伎倆。

+0

請注意,精度設置對序列化沒有影響,序列化常常*具有*以存儲大量數字,以便提供足夠的細節以獲取原始二進制值。在這種情況下調整精度只是一種破解,使得值的顯示方式類似於序列化存儲它的方式。但是原始值可能是* 4.1。所以真的,反序列化運行正常。 – Boann 2013-03-13 12:44:03