Question

J'essaie de stocker la valeur en virgule flottante PHP 63,59072952118762 dans une double colonne de précision dans Postgres. Postgres stocke la valeur 63,59073. Quelqu'un sait-il pourquoi? 8 octets devrait être plus que suffisant pour cette valeur. Je l'ai essayé avec le numérique de type de données qui fonctionne lors de la spécification de la précision, mais. Ne devrait pas vraiment être nécessaire

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

Mise à jour II (en partie 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é à PDO :: PARAM INT en manque d'une meilleure alternative (PARAM DOUBLE était pas une option), et a obtenu une précision de 10 chiffres dans le double stocké dans Postgres (certains progrès, au moins). J'ai vérifié que le type numérique fonctionne bien, il semble donc que numérique est la voie à suivre lors de l'utilisation PDO et double qui doit avoir une précision de plus de 10 décimales.

Quoi qu'il en soit, comme quelqu'un l'a dit, je ne sais pas s'il est un must pour moi d'avoir ce genre de précision, mais je pense que le problème en lui-même mérite d'être étudié.

Était-ce utile?

La solution

  • Comment déterminez-vous ce que PostgreSQL stocke?
  • Comment envoyer les données à PostgreSQL?
  • Comment obtenez-vous les données à nouveau?
  • Comment afficher-vous?
  • De quel type est la colonne dans la base de données?

Il y a 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. En utilisant une valeur littérale dans l'instruction INSERT conduit à un ensemble de problèmes différents d'utiliser les 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 PDO PostgresSQL font avec la valeur - est-il envoyé en double, ou comme une chaîne, et qui traite de code avec la conversion, etc. <. / p>

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

Autres conseils

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

PostgreSQL accepte flotteur (1) à flotteur (24) que de sélectionner le type réel, tout en flottant (25) à flotteur (53) sélectionner double précision.

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

Lequel utilisez-vous?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top