为什么 postgresql 不存储我的整个(PHP)浮点值?
-
12-09-2019 - |
题
我尝试将 PHP 浮点值 63.59072952118762 存储到 postgres 中的双精度列中。Postgres 将该值存储为 63.59073。有谁知道为什么?8 个字节对于该值来说应该绰绰有余。我尝试过使用数字数据类型,它在指定精度时有效,但这实际上并不是必要的。
更新: 当尝试存储 63.5907295 时也存在同样的问题,因此在存储 double 之前发生一些事情的建议似乎是现实的。
更新二(部分解决):我分配双参数的行如下所示:
$stmt->bindParam(4, $this->latitude);
我不知道的是 PDO 默认其参数类型为字符串。由于缺乏更好的替代方案(PARAM DOUBLE 不是一个选项),我将其更改为 PDO::PARAM INT,并且在 postgres 中存储的双精度数中获得了 10 位精度(至少取得了一些进展)。我已经检查过数字类型工作得很好,所以看起来数字是使用 PDO 和精度必须超过 10 位小数的双精度数时的最佳选择。
无论如何,正如有人提到的,我不知道我是否必须拥有这种精度,但我认为问题本身值得调查。
解决方案
- 你怎么确定什么PostgreSQL是储存?
- 你怎么发送的数据PostgreSQL?
- 你怎么得到的数据再回来吗?
- 你怎么显示?
- 什么类型列的数据库?
有许许多多的地方之间的路径PHP和PostgreSQL那里有可能混淆关于如何表示的数据。
重要的是要解释如何数据插入DBMS。使用文字值的插入的发言导致了一组不同的问题,从使用定参数。如果你写的价值在SQL:
INSERT INTO SomeTable(SomeColumn) VALUES(63.xxxxxxxxx);
和数据是截断了,你会有一个问题在PostgreSQL。如果你绑的可变的,你已经可以肯定的是要了解什么PHP和公设辩护人PostgresSQL模块的价值是它作为一个双人,或者作为一串,其交易代码转换等等。
你遇到类似问题与Perl+论+阻挡::YourDBMS(阻挡::Pg在你的情况)。
其他提示
PostgreSQL 接受 float(1) 到 float(24) 作为选择实数类型,而 float(25) 到 float(53) 选择双精度。
在大多数平台 PG 上,实数类型的范围至少为 1E-37 到 1E+37,精度至少为 6 位小数。双精度类型的范围通常约为 1E-307 到 1E+308,精度至少为 15 位(参考文献)
您使用哪一款?