【问题标题】:Serializing Floats in PHP - Unexpected Results在 PHP 中序列化浮点数 - 意外结果
【发布时间】:2016-01-25 15:19:28
【问题描述】:

我正在写一个 serialize() 解析器/验证器,我遇到了这个(有点意外的行为):

$float = 875.6745;
echo "serialize({$float}) === " . serialize($float) . "\n";
echo "(float) \"875.67449999999997\" === " . ((float) "875.67449999999997") . "\n";

输出:

序列化(875.6745) === d:875.67449999999997;

(浮点数)“875.67449999999997”=== 875.6745

当我序列化一个浮点数时,存储的值与输入并不真正匹配,但是,当序列化的字符串重新floated 时,该值再次匹配......

我应该担心吗?

【问题讨论】:

  • 那么,至于我的问题....?我应该担心吗? (我知道浮点数不准确,这就是我将标签应用于我的问题的原因)。
  • 答案是......这取决于......如果在 32 位系统上导出和在 64 位系统上导入,这可能会导致细微差异,反之亦然;但在大多数情况下它不会引起任何问题
  • 这就是我所希望的。谢谢

标签: php serialization floating-point floating-accuracy


【解决方案1】:

简短回答:您几乎可以肯定不需要担心。

长答案:PHP 只是打印足够的数字以确保它可以正确地正确读取数字。

没有浮点数 875.6745。当您输入数字时,它会转换为 IEEE754 binary64(在当今大多数计算机上也称为 C double)格式,并将其四舍五入为:

875.6744999999999663486960344016551971435546875

当你序列化它时,它不会打印这个数字(它也不需要):而是只保存 17 位数字,which is enough to ensure that it can read back the value exactly

这种转换在当今的大多数硬件中应该是一致的,并且您不必担心 32 位和 64 位平台:这与浮点数完全无关(自16 位 8086)。

(技术上是PHP says that the size of the float is platform dependent,但除非您与30 year old hardware打交道,否则您无需担心)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-09
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 2018-04-26
    • 2020-09-03
    相关资源
    最近更新 更多