2009-07-10 11 views
0

Je tente de stocker la valeur de virgule flottante PHP 63.59072952118762 dans une colonne double précision dans postgres. Postgres stocke la valeur en tant que 63.59073. Quelqu'un sait-il pourquoi? 8 octets devrait être plus que suffisant pour cette valeur. J'ai essayé avec le type de données numérique, qui fonctionne en spécifiant la précision, mais cela ne devrait pas vraiment être nécessaire.Pourquoi postgresql ne stocke-t-il pas toute ma valeur flottante (PHP)?

Mise à jour: Le même problème est présent lorsque vous essayez de stocker 63.5907295, donc la suggestion que quelque chose se passe avec le double avant qu'il ne soit stocké semble réaliste.

Update II (partiellement résolu): La ligne où j'attribue la double paramètre ressemble à ceci:

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

La chose que je ne savais pas que par défaut PDO son type de chaîne à param. Je l'ai changé en PDO :: PARAM INT en l'absence d'une meilleure alternative (PARAM DOUBLE n'était pas une option), et j'ai obtenu 10 chiffres de précision dans le double stocké dans postgres (quelques progrès, au moins). J'ai vérifié que le type numérique fonctionne bien, donc il semble que le numérique soit le chemin à parcourir quand on utilise PDO et double qui doit avoir une précision de plus de 10 décimales. De toute façon, comme quelqu'un l'a mentionné, je ne sais pas si c'est une nécessité pour moi d'avoir ce genre de précision, mais je pense que le problème en lui-même méritait d'être étudié.

+0

Avez-vous besoin que beaucoup de chiffres significatifs? Les calculs qui sont assez rares, d'après mon expérience (en particulier si SQL est approprié pour l'espace problème). Si vous le faites, peut-être que vous devriez utiliser NUMERIC, pas FLOAT. – kquinn

Répondre

2
  • Comment déterminez-vous ce que PostgreSQL stocke?
  • Comment envoyer les données à PostgreSQL?
  • Comment récupérer les données?
  • Comment l'afficher?
  • De quel type est la colonne dans la base de données?

Il ya beaucoup, beaucoup d'endroits sur le chemin entre PHP et PostgreSQL où il pourrait y avoir confusion sur la façon de représenter les données.


Il est important d'expliquer comment les données sont insérées dans le SGBD. L'utilisation d'une valeur littérale dans l'instruction INSERT entraîne un ensemble différent de problèmes liés à l'utilisation de paramètres liés. Si vous avez écrit la valeur dans le SQL:

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

et les données ont été tronquées, vous auriez un problème dans PostgreSQL. Si vous liez la variable, vous devez être sûr de comprendre ce que PHP et les modules PostgresSQL de PDO font avec la valeur - est-il envoyé en double, ou en tant que chaîne, et quel code traite de la conversion, et ainsi de suite.

Vous rencontrez des problèmes analogues avec Perl + DBI + DBD :: VotreDBMS (DBD :: Pg dans votre cas).

+0

De PHP via PDO dans une déclaration préparée. J'utilise PgAdmin comme indiqué ci-dessus. Je récupère également les données via PDO, et je ne les affiche pas, c'est un test unitaire qui échoue. Et je ne compare pas les doubles. La colonne est "double précision" comme je l'ai écrit dans la question. –

0

PostgreSQL accepte float (1) pour float (24) comme sélectionnant le type réel, tandis que float (25) pour float (53) sélectionne la double précision.

Sur la plupart des plates-formes PG, le type réel a une plage d'au moins 1E-37 à 1E + 37 avec une précision d'au moins 6 chiffres décimaux. Le type double précision a généralement une plage d'environ 1E-307 à 1E + 308 avec une précision d'au moins 15 chiffres (REF)

Lequel utilisez-vous?

1

Pensez à utiliser le type DECIMAL/NUMERIC si vous avez besoin que beaucoup de précision