【问题标题】:Why won't postgresql store my entire (PHP) float value?为什么 postgresql 不存储我的整个(PHP)浮点值?
【发布时间】:2009-07-10 21:13:23
【问题描述】:

我尝试将 PHP 浮点值 63.59072952118762 存储到 postgres 的双精度列中。 Postgres 将该值存储为 63.59073。有谁知道为什么?对于该值,8 字节应该绰绰有余。我已经尝试过使用数字数据类型,它在指定精度时有效,但实际上并不是必需的。

更新:在尝试存储 63.5907295 时会出现同样的问题,因此在存储之前双精度会发生某些事情的建议似乎是现实的。

更新二(部分解决):我分配双参数的行如下所示:

$stmt->bindParam(4, $this->latitude);

我不知道的是 PDO 将其参数类型默认为字符串。我将其更改为 PDO::PARAM INT 缺乏更好的选择(PARAM DOUBLE 不是一个选项),并且在存储在 postgres 中的双精度中获得了 10 位精度(至少有一些进展)。我已经检查过 numeric 类型是否运行良好,因此在使用 PDO 和必须具有超过 10 位小数的精度的双精度时,numeric 似乎是要走的路。

无论如何,正如有人提到的,我不知道我是否必须拥有这种精度,但我认为问题本身值得研究。

【问题讨论】:

  • 你需要那么多有效数字吗?根据我的经验,这种计算非常罕见(特别是如果 SQL 适合问题空间)。如果你这样做,也许你应该使用 NUMERIC,而不是 FLOAT。

标签: php postgresql precision math


【解决方案1】:
  • 如何确定 PostgreSQL 存储的内容?
  • 如何将数据发送到 PostgreSQL?
  • 如何重新取回数据?
  • 如何显示?
  • 数据库中的列是什么类型的?

在 PHP 和 PostgreSQL 之间的路径上有很多很多地方可能会混淆如何表示数据。


解释如何将数据插入 DBMS 很重要。在 INSERT 语句中使用文字值会导致与使用绑定参数不同的一组问题。如果你在 SQL 中写出值:

INSERT INTO SomeTable(SomeColumn) VALUES(63.xxxxxxxxx);

如果数据被截断,那么您在 PostgreSQL 中就会遇到问题。如果绑定变量,则必须确保了解 PHP 和 PDO PostgresSQL 模块对值的作用——它是作为双精度还是作为字符串发送,以及哪些代码处理转换,等等。

您在使用 Perl + DBI + DBD::YourDBMS(在您的情况下为 DBD::Pg)时遇到了类似的问题。

【讨论】:

  • 在准备好的语句中通过 PDO 来自 PHP。如上所述,我使用 PgAdmin。我还通过 PDO 取回数据,但我不显示它,这是一个失败的单元测试。而且我不比较双打。正如我在问题中所写,该列是“双精度”。
【解决方案2】:

如果您需要这么高的精度,请考虑使用 DECIMAL/NUMERIC 类型

【讨论】:

    【解决方案3】:

    PostgreSQL 接受 float(1) 到 float(24) 作为选择真实类型,而 float(25) 到 float(53) 选择双精度。

    在大多数平台 PG 上,real 类型的范围至少为 1E-37 到 1E+37,精度至少为 6 位十进制数字。双精度类型的范围通常在 1E-307 到 1E+308 左右,精度至少为 15 位 (REF)

    你用的是哪一个?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-12-16
      • 2019-10-17
      • 1970-01-01
      • 2021-08-05
      • 1970-01-01
      • 1970-01-01
      • 2011-11-23
      相关资源
      最近更新 更多