【问题标题】:unseralize + php gives convert original valueunseralize + php 提供转换原始值
【发布时间】:2013-03-13 09:33:19
【问题描述】:

这是我要反序列化的字符串。

$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 等。我希望原始值不转换。

【问题讨论】:

  • 好的...有什么问题?
  • 查看数组评论
  • 我知道这个功能以及如何使用我只是问为什么它会转换结果......奇怪为什么每个人都反对它。
  • 我猜不可能存储4.1 值并使用它。我们将其视为4.1,但PHP只能保存4.0999999999999996,并在此值上运行。

标签: php arrays serialization


【解决方案1】:

计算机很难精确处理浮点数。无需赘述,PHP 只是为浮点值的最大数量设置了一个值。这是在 precision 配置属性中设置的。它可能设置为 14,因此每个具有 14 个或更多浮点数的浮点数都会被舍入。

因此,您需要做的是增加 php.ini 中的 precision 值。或使用ini_set('precision', 20) 更改它。

这应该可以解决问题。

【讨论】:

  • 请注意,精度设置对序列化没有影响,序列化通常必须存储大量数字,以便提供足够的细节来取回原始二进制值。在这种情况下调整精度只是使值显示类似于序列化存储它的方式的一种技巧。但原始值可能 4.1。真的,反序列化运行良好。
猜你喜欢
  • 1970-01-01
  • 2011-08-09
  • 1970-01-01
  • 1970-01-01
  • 2019-02-16
  • 2016-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多