代码之家  ›  专栏  ›  技术社区  ›  Yngve Sneen Lindal

为什么PostgreSQL不存储整个(php)浮点值?

  •  0
  • Yngve Sneen Lindal  · 技术社区  · 15 年前

    我尝试将php浮点值63.59072952118762存储到Postgres中的双精度列中。Postgres将值存储为63.59073。有人知道为什么吗?8字节应该足够该值。我试过使用numeric数据类型,它在指定精度时有效,但实际上不需要这样做。

    更新: 当尝试存储63.5907295时,也会出现同样的问题,因此在存储Double之前对其进行处理的建议似乎是现实的。

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

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

    我不知道的是,pdo默认其参数类型为string。我把它改为pdo::param int,因为没有更好的选择(param double不是一个选项),在postgres中存储的double中得到了10位数的精度(至少有一些进展)。我已经检查过numeric类型的工作是否良好,所以在使用pdo和double时,numeric似乎是一种可行的方法,它的精度必须超过10个小数。

    不管怎样,正如有人提到的,我不知道我是否必须要有这样的精确性,但我认为这个问题本身应该被调查。

    3 回复  |  直到 15 年前
        1
  •  2
  •   Jonathan Leffler    15 年前
    • 如何确定PostgreSQL存储的是什么?
    • 如何将数据发送到PostgreSQL?
    • 如何重新获取数据?
    • 如何显示?
    • 数据库中的列是什么类型?

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


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

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

    数据被截断了,在PostgreSQL中会出现问题。如果绑定变量,必须确保了解php和pdo postgressql模块对该值的作用——它是以双精度形式发送,还是以字符串形式发送,以及处理转换的代码,等等。

    使用perl+dbi+dbd::yourdbms(在本例中是dbd::pg)会遇到类似的问题。

        2
  •  1
  •   Frank Farmer    15 年前

    考虑使用 DECIMAL/NUMERIC 如果你需要那么精确的打字

        3
  •  0
  •   Patrick Desjardins    15 年前

    PostgreSQL接受float(1)to float(24)作为实际类型,而float(25)to float(53)选择double precision。

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

    你用哪一个?