php serialize huge float导致舍入和格式化问题

时间:2018-05-22 16:13:10

标签: php

我有以下php代码段

<body>
  <img id="Logo" src="" alt="Correct Image">
  <script>
    // Just determine the appropriate source:
    var d = new Date();
    var Today = d.getDate();
    var Month = d.getMonth();
    var src;
    if (Month === 4 && (Today >= 21 && Today <= 23)) {
      src = "/images/holiday.png";
    } else {
      src = "/images/default.png";
    } 
    
    // And then set the image to it:
    document.getElementById("Logo").src = src;
</script>
</body>

输出:

$newData = serialize(array('ep' => 50733372961735.4));
echo "New data: " . print_r($newData, 1);

但我想浮动值不是E + 13.

如果不做大幅改动,我该怎么办,因为这只是一个例子。在我的实际代码中,'ep'值可能在复杂的数组层次结构中

3 个答案:

答案 0 :(得分:1)

首先,一般说明:序列化不应该用于可以以任何方式操作的数据。它对于会话数据和缓存这样的东西很有用,但不应该依赖于在应用程序或数据存储之间传输数据。在许多情况下,您最好使用像JSON这样的标准序列化格式。

您当然也不应该关心序列化字符串的外观 - 您应该对该字符串执行的操作将其传递回{{1 }}。因此,如果在反序列化时它返回的实际值是你想要的那个,那么unserialize()这个事实不是问题。

但是,在您的示例中很明显您丢失了精度 - 最后的数字是E+13而不是...29617 - 所以回到这一点:有一个PHP设置{{ 1}},described in the manual here。它的默认值多年来一直不同,但将其设置为-1以外的显式值将序列化具有该数字的有效数字的浮点数:

...29617354

请注意,第一个示例清楚地丢弃了信息,而第二个示例实际存储的精度比您实现的更高 - 因为the inaccuracy of storing decimals in binary floating point format

答案 1 :(得分:0)

问题不在于序列化!

一般来说是数字。

$num = 50733372961735.4;
print($num);

=> 50733372961735

要“解决”这个问题你可以使用:

ini_set('serialize_precision', 15);

答案 2 :(得分:-1)

我刚刚在www.writephponline.com上执行了您的代码

如果我没有将你的值放在字符串中,我得到了以下值: - $newData = serialize(array('ep' => 50733372961735.4));

  

新数据:a:1:{s:2:&#34; ep&#34 ;; d:50733372961735.398;}

在将其添加到字符串中之后: - $newData = serialize(array('ep' => '50733372961735.4'));

  

新数据:a:1:{s:2:&#34; ep&#34 ;; s:16:&#34; 50733372961735.4&#34 ;;}