为什么postgresql不会存储我的整个(PHP)浮点值?

时间:2009-07-10 21:13:23

标签: php postgresql precision math

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

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

更新II(部分解决):我指定double参数的行如下所示:

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

我不知道的是PDO将其param类型默认为string。我把它更改为PDO :: PARAM INT缺少更好的替代方案(PARAM DOUBLE不是一个选项),并且在postgres中存储的double中得到10位精度(至少有一些进展)。我已经检查过数字类型是否运行良好,所以看起来数字是使用PDO时的方法,双精度必须具有超过10位小数的精度。

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

3 个答案:

答案 0 :(得分:2)

  • 如何确定PostgreSQL存储的内容?
  • 如何将数据发送到PostgreSQL?
  • 如何重新获取数据?
  • 你如何展示它?
  • 数据库中的列是什么类型的?

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


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

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

并且数据被截断,你在PostgreSQL中遇到了问题。如果绑定变量,则必须确保理解PHP和PDO PostgresSQL模块对该值的作用 - 它是以double形式发送还是作为字符串发送,以及哪些代码处理转换,等等。 / p>

你遇到与Perl + DBI + DBD :: YourDBMS(在你的情况下是DBD :: Pg)类似的问题。

答案 1 :(得分:1)

如果您需要那么多精确度,请考虑使用DECIMAL/NUMERIC类型

答案 2 :(得分:0)

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

在大多数平台PG上,实际类型的范围至少为1E-37到1E + 37,精度至少为6位小数。双精度类型的范围通常为1E-307到1E + 308,精度至少为15位(REF

你使用哪一个?